2012-10-01 37 views
6

Me gustaría obtener una columna diferente de cada fila de una matriz. Por ejemplo:Obtenga una columna diferente en cada fila

A = [1,2;1,4;5,2] 
B = [2;2;1] 

la salida debe Rendimiento:

out = [2;4;5] 

Así que en resumen: A es la matriz y B tiene los índices de las columnas por fila. ¿Cómo puedo hacer esto sin usar un bucle (si es posible)?

Respuesta

7

Puede utilizar sub2ind para convertir los índices (i, j) para los índices lineales en matriz A

idx = sub2ind(size(A), 1:size(A, 1), B'); 
A(idx) 

ans = 

2  4  5 

que funciona asumiendo que el vector B tiene tantas entradas como hay filas en A. En la sub2ind anteriormente genera un índice lineal para cada par de números de fila subsiguientes (1: tamaño (A, 1)) y números de columna dados en B.

+0

Esto funciona perfectamente, gracias. Debo buscar la documentación de sub2ind para comprender completamente cómo funciona esto. – Tim

7

Puede hacerlo por diag(A(:,B)), sin embargo hay un bucle, pero solo implícito. No sé cómo hacerlo sin ningún bucle.

+1

Al igual que la respuesta mediante el uso de sub2ind, esto también hace el truco a la perfección. – Tim

+1

Este método funciona, por supuesto, pero en el camino crea una matriz N x N (A (:, B)). Esto es bastante sobrecargado, cuando lo que realmente deseas al final es un vector de tamaño N. – angainor

+1

Sí, y es por eso que elegí tu respuesta como la respuesta real :-). – Tim

Cuestiones relacionadas