Reputation: 525
For each column of a matrix A consisting of '0' and '1', I would like to find the column indices of the first occurrence of '1' if exists. For example, if A is defined as:
A=[0 0 0 0;
0 0 0 1;
0 0 0 0;
0 0 0 1;
1 0 0 0;
0 1 0 1;
1 1 0 0]
then the result would be:
b=[5 6 2]
I'm searching for a solution without any 'for' or 'while' loops.
One solution I came up with:
[b,~]=find(cumsum(cumsum(A))==1)
Is there a more elegant way to do this?
Upvotes: 5
Views: 7474
Reputation: 4650
This is shorter than anything posted and it's a one liner. Code:
[~,idx] = max(A(:,sum(A)>0));
Output:
idx =
5 6 2
EDIT: Just realized you can do:
[~,idx] = max(A(:,any(A)))
Upvotes: 5
Reputation: 5978
@Nacer - nice answer. By default [a,m,c] = unique(J) returns the vector m
to index the last occurrence of each unique value in J. Use [~,m] = unique(J, 'first');
instead.
[I,J] = find(A==1);
[~,m] = unique(J, 'first');
I(m)
ans =
5
6
2
Upvotes: 5