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

matlab arrays indexing octave

9265 просмотра

2 ответа

У меня есть 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 Источник Размещён: 12.11.2019 09:47

Ответы (2)


11 плюса

Решение

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

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

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

Автор: merv Размещён: 12.03.2010 08:02

2 плюса

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

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представляют строки.

Автор: Jacob Размещён: 12.03.2010 06:53
Вопросы из категории :
32x32