Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

find row with certain values

Asked by Daniel on 20 Dec 2011

Hello I am looking for a (simple) way to get the index of a row in which two (or n) values exist

example: looking for 4 and 5 in

[1 5 6; 5 4 3; 9 4 2]

will give me 2, because only row 2 has both 4 and 5 in it

Thanks

Daniel

2 Comments

Daniel on 22 Dec 2011

thank you all for the answers
since all of your answers do what I wanted I'll choose the "winner" by:
1. short code
2. running time
3. running time on large matrices and/or many numbers to find

Naz on 22 Dec 2011

I deleted my answer so it will be easier for you to make a decision.

Daniel

Tags

Products

No products are associated with this question.

6 Answers

Answer by Robert Cumming on 21 Dec 2011
Accepted answer

similar to the intersect answer - but I recoded intersect as its quite slow:

x=[1 2 3;4 5 6;3 2 1];
[a b]=find(x==4);
[c d]=find(x==5);
index = c.*NaN;
for kk=1:length(c)
  check =  a(a==c(kk))';
  if ~isempty ( check )
    index(kk) = check;
  end
end
output = index(~isnan(index));

0 Comments

Robert Cumming
Answer by Malcolm Lidierth on 20 Dec 2011
>> x=[1 5 6; 5 4 3; 9 4 2];
  >> [a b]=find(x==4);
  >> [c d]=find(x==5);
  >> intersect(a,c)
    ans =
         2

0 Comments

Malcolm Lidierth
Answer by Jan Simon on 20 Dec 2011
X = [1 5 6; 5 4 3; 9 4 2]
index = and(any(X == 4, 2), any(X == 5, 2));

[EDITED: Apply ANY along 2nd dim, thanks Cyclist!]

1 Comment

the cyclist on 20 Dec 2011

I think the "any" here should be over dimension 2, not dimension 1.

Jan Simon
Answer by the cyclist on 20 Dec 2011

Trust but verify this code:

x = [1 5 6; 5 4 3; 9 4 2]
want(1,1,:) = [4 5];
indexToDesiredRows = all(any(bsxfun(@eq,x,want),2),3)
rowNumbers = find(indexToDesiredRows)

0 Comments

the cyclist
Answer by Sean de Wolski on 20 Dec 2011

How about ismember with a for-loop?

doc ismember

Example

A = [1 5 6; 5 4 3; 9 4 2];
want = [4 5];
szA = size(A,1);
idx = false(szA,1);
for ii = 1:szA
  idx(ii) = all(ismember(want,A(ii,:)));
end

idx will be a logical vector of rows with 4 and 5. If you want the numeric values:

find(idx)

This will be the most scalable method if say you want 10 different numbers to be present in each row. Calling any/ intersect / all that many times and/or using that many dimensions is not really feasible.

0 Comments

Sean de Wolski
Answer by Ankit on 20 Apr 2013

>> x = [1 2 3 4 1 2 2 1]; find(sum(bsxfun(@eq,x',[1:3]),2)==1) ans =

     1
     2
     3
     5
     6
     7
     8
Similar things can be done for an array rather than just a vector (x above).

0 Comments

Ankit

Contact us