2010-03-12 14 views
7

Tengo una matriz 2D, llámala 'A'. Tengo otras dos matrices en 2D, llámalas 'ix' e 'iy'. Me gustaría crear una matriz de salida cuyos elementos son los elementos de A en los pares de índices proporcionados por x_idx y y_idx. Puedo hacer esto con un ciclo de la siguiente manera:dos matrices que definen coordenadas 2d, como índices de matriz, en matlab/octave


for i=1:nx 
    for j=1:ny 
     output(i,j) = A(ix(i,j),iy(i,j)); 
    end 
end 

¿Cómo puedo hacer esto sin el bucle? Si hago output = A (ix, iy), obtengo el valor de A en todo el rango de (ix) X (iy).

Gracias, Jason

+0

Ten cuidado - está utilizando la matriz ix para proporcionar la coordenada yy la matriz iy para proporcionar la x. En MATLAB, el primer índice es la coordenada y. Lo mismo aplica para su matriz de salida: está utilizando los límites incorrectos para los bucles for. –

+0

Buen punto, pero depende un poco de cómo usa los datos. Si no le importa que la visualización de su matriz muestre x arriba-abajo e y, de izquierda a derecha, no hay un problema fundamental con respecto a esa convención de Matlab. Pero seguro es importante saber, estoy de acuerdo. –

Respuesta

11

Una forma más rápida es utilizar indexación lineal directamente sin llamar SUB2IND:

output = A(size(A,1)*(iy-1) + ix) 

... pensar en la matriz A como una matriz de 1D (orden por columnas)

+0

¡Guau, eso es mucho más rápido! Gracias. – Jason

+2

@Jacob: en realidad, creo que 'output' terminará en el mismo tamaño que' ix'. – gnovice

+0

¡Respuesta inteligente! Muchas gracias. –

2

Este es el método de una línea que no es muy eficiente para grandes matrices

reshape(diag(A(ix(:),iy(:))),[ny nx]) 

Un método más claro y más eficiente sería utilizar sub2ind. He incorporado el comentario de puaj para situaciones (como la suya) cuando ix y iy tienen el mismo número de elementos:

newA = A(sub2ind(size(A),ix,iy)); 

Además, no hay que confundir x y y para ij y en notación - j y x general Representar columnas y i y y representan filas.

+0

Hombre, lo siento por todas las ediciones! No estoy pensando claramente hoy. – Jacob

+2

El código sub2ind puede ser simplemente: newA = A (sub2ind (tamaño (A), ix, iy)); – yuk

+0

¡Perfecto! ¡Muchas gracias! – Jason

Cuestiones relacionadas