2009-07-18 11 views
6

Considere una matriz M y un conjunto de subíndices almacenados en columnas I y J. Necesito acceder a los elementos designados por I & J sin convertirlos a índices lineales (es decir, usando sub2ind). P.ej.valores Acceso utilizando subíndices sin utilizar sub2ind

M = [1 2 3;4 5 6;7 8 9]; 
I = [1 1 1]; 
J = [1 2 3]; 

VALS = [1 2 3]; 

También, haciendo lo siguiente no es factible ya que & J son huge:

VALS = diag(M(I,J)); 

Y para la demostración, esto es no lo que estoy buscando,

VALS = M(sub2ind(size(M),I,J)); 

Básicamente sub2ind parece tomar mucho tiempo y en este momento estoy buscando métodos para acceder a estos elementos sin ti t convertir los subíndices a índices. Cualquier otra forma es factible siempre que sea más rápido que el método que usa sub2ind.

Respuesta

7

Este puede ser más rápido que utilizando SUB2IND:

[r,c] = size(M); % Get the size of M 
vals = M(I+r.*(J-1)); % Compute a linear index with vector operations 
+1

En versiones recientes de Matlab, en realidad esto puede evitar un gran asignación de memoria, porque Matlab suele ser lo suficientemente inteligente como para calcular los resultados intermedios sin crear grandes temporales, es decir, hará la indexación y la asignación de la forma en que lo haría una persona en C. –

+0

Eso es realmente lo mismo que lo que hace 'sub2ind' a excepción de las verificaciones de límites. El beneficio de velocidad proviene principalmente de omitir las llamadas a 'min' y' max' que esas comprobaciones de límites realizan en los índices. En contraste con lo que escribió el Sr. Fooz, en algunas pruebas que realicé en R2015b con enormes 'I' y' J', resultó ser ligeramente más eficiente calcular primero el índice lineal como 'ind = I + r . * (J-1) 'y luego' M (ind) ', en lugar de calcular' M (I + r. * (J-1)) 'de una vez. –

Cuestiones relacionadas