MATLAB вопрос индексации - PullRequest
       20

MATLAB вопрос индексации

9 голосов
/ 30 января 2011

у меня есть матрица, например

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

и вектор размером 1x3, который указывает, какой элемент в каждой строке является тем, который я ищу, т.е. если

vector = [ 1 2 1 ]

, тогда желаемый результат равен

[ 1 5 7 ]

, поскольку 1 является 1-м элементом в 1-й строке, 5 является 2-м во 2-й строке, а 7 является 1-м элементом в 3-й строке строка.

Как мне этого добиться? Не удалось найти встроенную функцию для этого, что меня удивило.

Ответы [ 4 ]

8 голосов
/ 30 января 2011

MATLAB предоставляет функцию SUB2IND для преобразования индексов строк / столбцов в линейные индексы:

>> 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
6 голосов
/ 30 января 2011

Прежде всего, индексы в Matlab идут сверху вниз.
Так что в вашем случае A [1] = 1, A [2] = 4, A [3] = 7

Тем не менее, было бы легче работать с A ', потому что это немного более тривиально.

B = A';

B((vector + [0:2].* 3))
5 голосов
/ 30 января 2011

Это немного уродливо, но diag(A(1:3,[1 2 1])) добьется цели.

0 голосов
/ 31 января 2011

Вот вариант ответ Йохая , но без транспонирования (это также в основном то, что SUB2IND делает в ответ Амро ):

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

Или для массива A произвольного размера:

 nRows = size(A,1);
 output = A((1:nRows)+nRows.*(vector-1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...