5

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?

4

2 回答 2

5

@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
于 2013-03-30T12:48:35.163 回答
5

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)))
于 2013-03-30T14:38:36.327 回答