Find the First element that satisfies a condition
Afficher commentaires plus anciens
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
Plus de réponses (3)
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
le 12 Mar 2016
Andrei, you never cease to amaze me with the efficiency of you code.
My only criticism is that you need to be a bit more careful when copying it to paste to your Answer:
A = [7 3 9;5 8 8;0,2,6];
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))'
Add the last parenthesis and the transpose operator and it works.
Andrei Bobrov
le 14 Mar 2016
Thank you Star for your comment.
Star Strider
le 14 Mar 2016
My pleasure.
That is brilliant code!
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.
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.
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 Resizing and Reshaping Matrices dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!