Я хочу получить вектор элементов матрицы 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 синтаксис для этого? Постарайтесь не предлагать для циклов или чего-либо, что не находится в векторизованной форме, поскольку мне нужно это, чтобы быть сделанным быстро. Надо надеяться, будет некоторая встроенная функция.
, чтобы получить его наиболее быстрым способом, используйте линейную индексацию :
A((j-1)*size(A,1)+i)
помните, что MATLAB использует порядок по столбцам.
A(sub2ind(size(A),i,j))
Если вы действительно жаждете скорости, вы можете попробовать создать свою собственную копию sub2ind.m, которая удаляет все проверки ввода, которые выполняет эта функция.
Сейчас я использую это:
>> diag(A(i,j))
ans =
1
7
12
Чтобы понять, как это сделать, лучше всего понять, как 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