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

Daniel
Daniel 2011년 12월 22일
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 2011년 12월 22일
I deleted my answer so it will be easier for you to make a decision.

댓글을 달려면 로그인하십시오.

 채택된 답변

Robert Cumming
Robert Cumming 2011년 12월 21일

0 개 추천

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));

댓글 수: 2

kd p
kd p 2017년 12월 6일
output doesn't show for this!
the cyclist
the cyclist 2017년 12월 6일
편집: the cyclist 2017년 12월 6일
What do you mean by "doesn't show"?
That code calculates the output (at least for me). Nothing is displayed to the screen because the line ends with a semicolon, which suppresses this display.
You can removed that semicolon, or just type
output
to see the result.
If that code is not even calculating the output for you, then please post the full error message you are getting.

댓글을 달려면 로그인하십시오.

추가 답변 (5개)

Jan
Jan 2011년 12월 20일

12 개 추천

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

the cyclist
the cyclist 2011년 12월 20일
I think the "any" here should be over dimension 2, not dimension 1.

댓글을 달려면 로그인하십시오.

Malcolm Lidierth
Malcolm Lidierth 2011년 12월 20일

5 개 추천

>> 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
the cyclist
the cyclist 2011년 12월 20일

2 개 추천

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)
Sean de Wolski
Sean de Wolski 2011년 12월 20일

1 개 추천

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.

댓글 수: 1

Soyy Tuffjefe
Soyy Tuffjefe 2019년 8월 27일
Suppose that A = [1 5 6 13 22; 9 5 4 6 37; 7 1 4 22 37];
and want = [5 6; 1 22; 4,37];
Please, Can you modify your code for find two o more rows; or any idea for me to try this job with your code I have a want matriz of 100x4 and A matrix of 1000x5 order.
Thanks

댓글을 달려면 로그인하십시오.

Ankit
Ankit 2013년 4월 20일

0 개 추천

>> 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).

카테고리

도움말 센터File Exchange에서 Data Type Identification에 대해 자세히 알아보기

태그

질문:

2011년 12월 20일

댓글:

2019년 8월 27일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by