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

New to MATLAB?

find row with certain values

Asked by Daniel

Daniel (view profile)

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

Daniel (view profile)

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

Naz (view profile)

on 22 Dec 2011

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

Daniel

Daniel (view profile)

Tags

Products

No products are associated with this question.

6 Answers

Answer by Robert Cumming

Robert Cumming (view profile)

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

Robert Cumming (view profile)

Answer by Malcolm Lidierth

Malcolm Lidierth (view profile)

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

Malcolm Lidierth (view profile)

Answer by Jan Simon

Jan Simon (view profile)

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

the cyclist (view profile)

on 20 Dec 2011

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

Jan Simon

Jan Simon (view profile)

Answer by the cyclist

the cyclist (view profile)

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

the cyclist (view profile)

Answer by Sean de Wolski

Sean de Wolski (view profile)

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

Sean de Wolski (view profile)

Answer by Ankit

Ankit (view profile)

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

Ankit (view profile)

Contact us