Matrix Indices Problem

Given a matrix e.g. A = [0 1 2 0 0; 0 3 4 5 0; 6 7 8 9 10; 0 0 0 11 0]
what MATLAB code will generate a vector of the column numbers of the first non-zero element in each row?
For this example the vector returned should be: [2;2;1;4]

 Respuesta aceptada

Sean de Wolski
Sean de Wolski el 15 de Ag. de 2011

2 votos

[junk, idx] = max(logical(A),[],2)
idx will be you index vector.

6 comentarios

Oleg Komarov
Oleg Komarov el 15 de Ag. de 2011
Nice.
Paulo Silva
Paulo Silva el 15 de Ag. de 2011
+1
mutt
mutt el 15 de Ag. de 2011
Very neat trick. But how about the last non-zero element in each row? [3;4;5;4]
Paulo Silva
Paulo Silva el 15 de Ag. de 2011
A=[0 1 2 0 0; 0 3 4 5 0; 6 7 8 9 10; 0 0 0 11 0]
[junk, idx] = max(logical(fliplr(A)),[],2)
idx=size(A,2)+1-idx
Fangjun Jiang
Fangjun Jiang el 15 de Ag. de 2011
Use sort().
A = [0 1 2 0 0; 0 3 4 5 0; 6 7 8 9 10; 0 0 0 11 0];
[dummy,Ind]=sort(A~=0,2)
Ind=Ind(:,end)
To find first non-zero,
A = [0 1 2 0 0; 0 3 4 5 0; 6 7 8 9 10; 0 0 0 11 0];
[dummy,Ind]=sort(A~=0,2,'descend')
Ind=Ind(:,1)
mutt
mutt el 16 de Ag. de 2011
Thanks to everyone for contributing. In practice I wouldn't use the sort approach because my real matrix is very large.

Iniciar sesión para comentar.

Más respuestas (1)

Andrei Bobrov
Andrei Bobrov el 15 de Ag. de 2011

0 votos

size(A,2)+1-sum(cumsum(A,2)~=0,2)
more
(sum(cumsum(A')==0)+1)'

2 comentarios

mutt
mutt el 15 de Ag. de 2011
Very good. And re-using that logic I have for the last non-zero elements:
size(A,2)+1-sum(not(logical(cumsum(A,2)-repmat(max(cumsum(A,2),[],2),1,size(A,2))))~=0,2)
Could this be simplified?
Andrei Bobrov
Andrei Bobrov el 16 de Ag. de 2011
Hi Mutt! my variant:
sum(cumsum(flipud(A'))>0)'

Iniciar sesión para comentar.

Categorías

Productos

Preguntada:

el 15 de Ag. de 2011

Community Treasure Hunt

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

Start Hunting!

Translated by