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?
To find the index of the element in the array, you can use the find() function. Using the find() function you can find the indices and the element from the array. The find() function returns a vector containing the data.
The most common way is to explicitly specify the indices of the elements. For example, to access a single element of a matrix, specify the row number followed by the column number of the element. e is the element in the 3,2 position (third row, second column) of A .
k = find( X ) returns a vector containing the linear indices of each nonzero element in array X . If X is a vector, then find returns a vector with the same orientation as X . If X is a multidimensional array, then find returns a column vector of the linear indices of the result.
If for example your matrix is A, you can use : size(A,1) for number of rows. size(A,2) for number of columns. Also there are some other ways like : length ( A(:,1) ) for number of rows.
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)))
@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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With