2009-12-19 25 views
5

Quiero obtener un vector de elementos de una matriz de Matlab en ubicaciones predefinidas. Por ejemplo, tengo el siguienteConvertir una matriz de matlab en un vector

>> i = [1,2,3]; 
>> j = [1,3,4]; 
>> A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16] 

A = 

    1  2  3  4 
    5  6  7  8 
    9 10 11 12 
    13 14 15 16 

Quiero un vector que me dará los valores de A en los lugares correspongin a i,j. Intenté

A(i,j) 

ans = 

    1  3  4 
    5  7  8 
    9 11 12 

pero esto no es lo que quería. Quiero obtener la siguiente

>> [A(i(1),j(1)); A(i(2),j(2));A(i(3),j(3))] 

ans = 

    1 
    7 
    12 

¿Cuál es la sintaxis de matlab para eso? Por favor, evite sugerir bucles o cualquier cosa que no esté en forma vectorizada, ya que necesito que esto se haga rápidamente. Esperemos que haya alguna función incorporada.

Respuesta

4

conseguirlo de la manera más rápida, utilice la indexación lineal :

A((j-1)*size(A,1)+i) 

recordar que MATLAB utiliza un orden de columnas-importante.

0

Por ahora estoy usando esto:

>> diag(A(i,j)) 

ans = 

    1 
    7 
    12 
+3

Si bien esto funcionará, es una opción pobre en general, ya que primero crea una nueva matriz 3x3 en la memoria, luego arroja la mayor parte de esa matriz en el cubo de bits utilizando la función diag. Si sus matrices y la lista de puntos en (i, j) eran en general, entonces el truco de diagnóstico sería bastante ineficiente. –

3
A(sub2ind(size(A),i,j)) 

Si realmente anhela velocidad, es posible que trate de hacer su propia copia de sub2ind.m que elimina toda la entrada y la comprobación de que esa función hace.

2

Para comprender cómo hacerlo, es mejor comprender cómo Matlab almacena sus matrices. En la matriz:

i = [1,2,3]; 
j = [1,3,4]; 
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16] 

matlab almacena los elementos que bajan las columnas. Por lo tanto, realmente residen en la memoria en el orden:

{1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16} 

En realidad, puede indexar una matriz de 2 d utilizando un índice SINGLE. Es por eso que el truco sub2ind funciona. Dado que los elementos que desea obtener son el primero, los elementos 10 y 15, como se almacena en un ordenamiento por columnas,

singleIndex = [1 10 15]; 
A(singleIndex) 
ans = 
    1  7 12 

Para confirmar que sub2ind dio esa lista de índices, probarlo ...

ind = sub2ind([4 4],i,j) 
ind = 
    1 10 15 
Cuestiones relacionadas