Преобразование matlab матрицы к вектору

Я хочу получить вектор элементов матрицы 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 в местоположениях correspongin к 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 синтаксис для этого? Постарайтесь не предлагать для циклов или чего-либо, что не находится в векторизованной форме, поскольку мне нужно это, чтобы быть сделанным быстро. Надо надеяться, будет некоторая встроенная функция.

5
задан dzhelil 19 December 2009 в 01:02
поделиться

4 ответа

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

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

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

4
ответ дан 14 December 2019 в 01:09
поделиться
A(sub2ind(size(A),i,j))

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

3
ответ дан 14 December 2019 в 01:09
поделиться

Сейчас я использую это:

>> diag(A(i,j))

ans =

     1
     7
    12
0
ответ дан 14 December 2019 в 01:09
поделиться

Чтобы понять, как это сделать, лучше всего понять, как 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}

Фактически вы можете индексировать двумерный массив, используя ОДИН индекс. Вот почему уловка 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
2
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: