2010-10-11 8 views
11

Para una matriz de tamaño arbitrario x, ¿cómo encuentro el índice del último elemento distinto de cero en cada fila de una matriz determinada?¿Encontrar el índice del último elemento distinto de cero en cada fila de una matriz dada?

Por ejemplo, para la matriz

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ] 

el vector [ 3 6 0 5 ] se debe obtener.

+1

Este no sería tarea, ¿verdad? – LittleBobbyTables

+1

esto me parece bastante tarea ... – FatherStorm

+2

Sí, pero es una pregunta divertida. – Jonas

Respuesta

4

Aquí hay una versión:

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ]; 
c = arrayfun(@(k) find(x(k,:)~=0,1,'last'), 1:size(x,1), 'UniformOutput',false); 
c(cellfun(@isempty,c)) = {0}; 
v = cell2mat(c); 

v = 
    3  6  0  5 

EDITAR: Considere esta solución alternativa:

[m,v] = max(cumsum(x'~=0)); 
v(m==0) = 0; 

v = 
    3  6  0  5 
+0

tu taxi probablemente escriba una mejor solución vectorizada usando una combinación de CUMSUM y DIFF ... Veamos si puedo resolver uno :) – Amro

+0

Realmente lo aprecio .. –

+1

@Jack Lu: Si encuentras una solución útil, considera subirla/aceptarla. – Jonas

10

Aquí hay una versión más corta, combinando find y accumarray

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ]; 
%# get the row and column indices for x 
[rowIdx,colIdx] = find(x); 
%# with accumarray take the maximum column index for every row 
v = accumarray(rowIdx,colIdx,[],@max)' 
v = 
    3 6 0 5 
+1

uso de accumarray, trataré de recordarlo. +1 – Adrien

1

Mi respuesta es un poco retorcido pero debería funcionar también

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ]; 
[~,pos] = max([fliplr(x~=0),ones(size(x,1))],[],2); 
v = size(x,2)-pos' +1; 
+0

necesita agregar uno a 'v' ... – Amro

+0

true, bad cut & paste, corregido ahora. – Adrien

2

solución de una línea con bsxfun:

result = max(bsxfun(@times, x~=0, 1:size(x,2)).'); 

O utilizar las dos salidas del max:

[val, result] = max(fliplr(x~=0).',[],1); %' 
result = (size(A,2)+1-result).*val; 
Cuestiones relacionadas