2011-01-30 6 views
9

tengo una matriz, por ejemploMATLAB pregunta indexación

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

y un vector de tamaño 1x3 que especifica qué elemento de cada fila es el que estoy buscando - es decir, si

vector = [ 1 2 1 ] 

continuación, la salida deseada es

[ 1 5 7 ] 

desde 1 es el elemento 1'st en la fila 1'st, 5 es el 2'nd en la fila 2'nd, y 7 es el 1er elemento en la fila 3'rd.

¿Cómo logro esto? No pude encontrar una función incorporada para hacer esto, lo que me sorprendió.

+1

Relacionados: [Acceso a valores utilizando subíndices sin utilizar sub2ind] (http://stackoverflow.com/questions/1146719/accessing-values-using-subscripts-without-using-sub2ind) – gnovice

Respuesta

6

Antes que nada, los índices en Matlab van de arriba a abajo.
Así, en su caso A [1] = 1, A [2] = 4, A [3] = 7

Dicho esto, sería más fácil trabajar en A', porque es un poco más trivial.

B = A'; 

B((vector + [0:2].* 3)) 
+0

De la documentación: * "A (:) son todos los elementos de A, considerados como una sola columna. "*. Como nota al margen para entender la indexación. – zellus

5

Es un poco feo, pero diag(A(1:3,[1 2 1])) hará el truco.

+0

Hice lo mismo: diag (A (:, vector)) ' –

8

MATLAB proporciona la función SUB2IND para convertir filas/columnas subíndices de los índices lineales:

>> A = [1 2 3; 4 5 6; 7 8 9]; 
>> idx = sub2ind(size(A),1:3,[1 2 1]); %# rows: [1 2 3], cols: [1 2 1] 
>> A(idx) 
    1  5  7 
0

Aquí hay una variación de Yochai's answer pero sin la transpuesta (esto también es básicamente lo SUB2IND qué en Amro's answer):

output = A((1:3)+3.*(vector-1)); 

O para una matriz A de un tamaño arbitrario:

nRows = size(A,1); 
output = A((1:nRows)+nRows.*(vector-1));