Преобразование матрицы Matlab в вектор - PullRequest
5 голосов
/ 19 декабря 2009

Я хочу получить вектор элементов матрицы Matlab в предопределенных местоположениях. Например, у меня есть следующее

>> 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

Я хочу вектор, который даст мне значения A в местах, соответствующих i,j. Я пытался

A(i,j)

ans =

     1     3     4
     5     7     8
     9    11    12

но это не то, что я хотел. Я хочу получить следующее

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

ans =

     1
     7
    12

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

Ответы [ 4 ]

4 голосов
/ 19 декабря 2009

, чтобы получить его самым быстрым способом, используйте линейное индексирование :

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

помните, что MATLAB использует мажорный порядок столбцов.

3 голосов
/ 19 декабря 2009
A(sub2ind(size(A),i,j))

Если вы действительно жаждете скорости, вы можете попробовать создать свою собственную копию sub2ind.m, которая убирает все проверки ввода, которые выполняет эта функция.

2 голосов
/ 19 декабря 2009

Чтобы понять, как это сделать, лучше всего понять, как matlab хранит свои массивы. В матрице:

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 хранит элементы, идущие вниз по столбцам. Таким образом, они на самом деле находятся в памяти в следующем порядке:

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

Вы можете индексировать двумерный массив, используя индекс SINGLE. Вот почему трюк sub2ind работает. Поскольку элементы, которые вы хотите получить, это 1-й, 10-й и 15-й элементы, которые хранятся в столбцовом порядке,

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

Чтобы подтвердить, что sub2ind дал этот индексный список, попробуйте ...

ind = sub2ind([4 4],i,j)
ind =
     1    10    15
0 голосов
/ 19 декабря 2009

Пока я использую это:

>> diag(A(i,j))

ans =

     1
     7
    12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...