两个数组定义了二维坐标,作为数组索引

7

我有一个二维数组,称之为A。我还有两个其他的二维数组,称之为ixiy。我想创建一个输出数组,其元素是由ixiy提供的索引对应的A数组的元素。我可以使用循环来完成如下:

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

如何不使用循环来实现这个? 如果我使用 output = A(ix,iy),我会获得A在整个(ix)X(iy)范围内的值。


小心 - 您正在使用ix数组提供y坐标,iy数组提供x坐标。在MATLAB中,第一个索引是y坐标。 对于您的输出矩阵也是如此 - 您正在为for循环使用错误的限制。 - Lubo Antonov
好观点,但这有点取决于他如何使用数据。如果他不在意显示矩阵将会上下颠倒x和左右颠倒y,那么与Matlab约定不同没有根本性问题。但我同意知道这一点很重要。 - Jonas Heidelberg
2个回答

11

更快的方法是直接使用线性索引而不调用SUB2IND函数:

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

...将矩阵A视为一维数组(以列优先顺序)


哇,这快多了!谢谢。 - Jason
2
@Jacob:实际上,我认为output最终会和ix的大小相同。 - gnovice
智能回答!非常感谢。 - Hesham Eraqi

3

这是一种适用于小矩阵但不太适用于大矩阵的单行方法。

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

更清晰、更高效的方法是使用sub2ind。我已经结合了yuk的评论,针对ix和iy具有相同元素数量的情况(例如您的情况):
newA = A(sub2ind(size(A),ix,iy));

此外,在符号表示中不要混淆xyij - 一般情况下,jx代表列,iy代表行。

抱歉,我编辑了这么多次!今天我的思维不太清晰。 - Jacob
2
sub2ind代码可以简单地写成:newA = A(sub2ind(size(A),ix,iy)); - yuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接