【问题标题】:Two arrays defining 2D coordinates, as array indices定义二维坐标的两个数组,作为数组索引
【发布时间】:2011-01-26 23:03:20
【问题描述】:

我有一个二维数组,称之为A。我还有另外两个二维数组,分别称为ixiy。我想创建一个输出数组,其元素是Aixiy 提供的索引对处的元素。我可以通过如下循环来做到这一点:

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

如何在没有循环的情况下做到这一点?如果我做output = A(ix,iy),我会在 (ix)X(iy) 的整个范围内得到 A 的值。

【问题讨论】:

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

标签: matlab arrays indexing octave


【解决方案1】:

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

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

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

【讨论】:

  • 哇,速度快多了!谢谢。
  • @Jacob:实际上,我认为output 的大小最终会与ix 相同。
  • 智能解答!非常感谢。
【解决方案2】:

这是一种单行方法,对大型矩阵不是很有效

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

更清晰、更有效的方法是使用sub2ind。当ixiy 具有相同数量的元素时,我已经合并了yuk 的评论:

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

另外,不要将 xy 与符号中的 ij 混淆 - jx 通常代表列,iy 代表行。

【讨论】:

  • 伙计,抱歉所有的编辑!我今天没有想清楚。
  • sub2ind 代码可以是:newA = A(sub2ind(size(A),ix,iy));
  • 完美!非常感谢!
猜你喜欢
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2021-06-04
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多