Find the First element that satisfies a condition

99 vues (au cours des 30 derniers jours)
Tyler
Tyler le 12 Mar 2016
Commenté : Jay Edelman le 11 Août 2023
I have an nxn matrix and would like to find the first element in each row that satisfies a given condition, and gives me NaN if there are none that meet the condition. The find command will give me all elements that satisfy it, but I only care about the first one in each row.
For instance, if my matrix is A = [7 3 9;5 8 8;0,2,6] and my condition is A<5, I would like to use a function that gives me [3 NaN 0] or at least tells me where in the matrix I can find those values and use it to index A.
Thanks!

Réponse acceptée

Stephen23
Stephen23 le 12 Mar 2016
Modifié(e) : Stephen23 le 12 Mar 2016
No loops or find is required, just some logical indexing does the trick:
>> A = [7 3 9;5 8 8;0,2,6];
>> B = A.'; % important: arrange the data columnwise
>> X = B<5;
>> Y = cumsum(X,1)==1 & X;
>> Z = any(Y,1);
>> out(Z) = B(Y);
>> out(~Z) = NaN
out =
3 NaN 0
  2 commentaires
Tyler
Tyler le 12 Mar 2016
Thanks! Is there a way to output only the index of each row?
Jay Edelman
Jay Edelman le 11 Août 2023
A = [7 3 9;5 8 8;0,2,6];
X = A < 5;
[r,c] = find(cumsum(X>0,2)==1 & X);
idxs = NaN(height(X),1);
idxs(r) = c;

Connectez-vous pour commenter.

Plus de réponses (3)

Andrei Bobrov
Andrei Bobrov le 12 Mar 2016
Modifié(e) : Andrei Bobrov le 14 Mar 2016
t = A < 5;
x = cumsum(t,2) == 1 & t;
out = sum(x.*A,2);
out(~any(t,2)) = nan
idx = x*(1:size(A,2))'
  4 commentaires
Star Strider
Star Strider le 14 Mar 2016
My pleasure.
That is brilliant code!
Olubunmi Anthony Jeyifous
Olubunmi Anthony Jeyifous le 11 Nov 2018
Hi I have a similar problem. I have a long column vector and i would like to know the first row number the condition is met.

Connectez-vous pour commenter.


Bill Tubbs
Bill Tubbs le 12 Avr 2021
If you only want to find the locations in A where the condition is true and then index those values you can use find:
>> elements_idx = find(A<5)
elements_idx =
3
4
6
>> A(elements_idx)
ans =
0
3
2
Note: the indices in elements_idx are not (row, col) indices as you might expect for a matrix but linear indices starting in the top-left element and incrementing down through each column from left to right.

MHN
MHN le 12 Mar 2016
Modifié(e) : MHN le 12 Mar 2016
If you dont mind a little coding:
A = [7 3 9;5 8 8;0,2,6];
FirstCon = zeros(size(A,1),1);
i=1;
B = A'; % I am going to use the power of Matlab for processing a whole column, so I have to reverse the original matrix, so the rows become columns.
for I = B
temp = I(I<5);
if isempty(temp)
FirstCon(i,1) = NaN;
else
FirstCon(i,1) = temp(1);
end
i=i+1;
end

Catégories

En savoir plus sur Particle & Nuclear Physics dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by