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

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


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

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

Спасибо, Jason

7
задан Jason 12 March 2010 в 18:50
поделиться

2 ответа

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

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

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

11
ответ дан 6 December 2019 в 19:35
поделиться

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

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

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

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

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

2
ответ дан 6 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

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