два массива, определяющие 2d координаты, как индексы массива, в matlab / octave - PullRequest
7 голосов
/ 12 марта 2010

У меня есть 2D-массив, назовите его «A». У меня есть два других 2D-массива, назовите их «ix» и «iy». Я хотел бы создать выходной массив, элементами которого являются элементы A в индексных парах, предоставляемых x_idx и y_idx. Я могу сделать это с помощью цикла следующим образом:


for i=1:nx
    for j=1:ny
        output(i,j) = A(ix(i,j),iy(i,j));
    end
end

Как я могу сделать это без цикла? Если я выведу = A (ix, iy), я получу значение A во всем диапазоне (ix) X (iy).

Спасибо, Jason

Ответы [ 2 ]

11 голосов
/ 12 марта 2010

Более быстрый способ - использовать линейное индексирование напрямую, без вызова SUB2IND:

output = A( size(A,1)*(iy-1) + ix )

... думать о матрице A как одномерном массиве (по столбцам)

2 голосов
/ 12 марта 2010

Это однострочный метод, который не очень эффективен для больших матриц

reshape(diag(A(ix(:),iy(:))),[ny nx])

Более понятный и эффективный метод - использовать sub2ind . Я включил комментарий Юка для ситуаций (подобных вашей), когда ix и iy имеют одинаковое количество элементов:

newA = A(sub2ind(size(A),ix,iy));

Кроме того, не путайте x и y для i и j в обозначениях - j и x обычно представляют столбцы, а i и y представляют строки.

...