Я имею 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
Более быстрый способ - использовать линейную индексацию напрямую, без вызова SUB2IND:
output = A( size(A,1)*(iy-1) + ix )
... думайте о матрице A как о одномерном массиве (порядок по столбцам)
Это однострочный метод, который не очень эффективен для больших матриц.
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
представляют собой строки.