有没有更简单的方法在 Matlab 中迭代二维数组



我有这样的代码:

for i = 2:3:11
    for j = 2:3:11
     % some code 
    end
end

它通过"3×3"矩阵遍历数组(例如 A)。我想知道,是否有更简单的解决方案来做到这一点,例如

A = [2:11,2:11];

命令?

解决方案

A(2:3:11,2:311)

运行良好,谢谢你们,但如果确切的代码是这样的呢:

 for i = 2:3:11
    for j = 2:3:11
       a = i-1:i+1;
       b = j-1:j+1;
       R = img(a,b);
       I = mean(mean(R));
       % some more code
    end
end

所以我不仅想要这些元素,而且要处理所有 9 个元素。(具有确切位置的那个和它们周围的 8 个。

A(2:3:11,2:3:11)

将准确返回包含您在第一个代码示例中循环的元素的矩阵。

您也可以像这样修改矩阵 A:

A(2:3:11,2:3:11) = A(2:3:11,2:3:11)*2;

什么是最优雅的取决于你想用元素做什么。Matlab 支持许多矩阵/矢量命令,可以大大加快计算速度。

你可以得到A的子集:

B = A(2:3:11, 2:3:11)

在此示例中,A的尺寸必须至少为 11x11。

一般来说,我认为它不会变得更简单。

但也许你可以给它一些结构,这样它就会更干净/更容易使用。

有用的命令是reshapemat2cell

例如,这会将其变成一个单元格,其中 3x3 矩阵已经分组。

a = rand(11,11)
eg = mat2cell(a,[1,3,3,3,1],[1,3,3,3,1])

或者甚至将它们排列在 4D 数组中(如果您对这么多维度感到满意......

如果您考虑丢失其中一个for循环,您可以尝试线性索引(ind2subsub2ind都用于此)。

首先,创建一个接受该大小的块的函数,并返回标量或另一个相同大小的块,如下所示:

function pro = process_block (blk)
  %% blk.data will be a 3x3 block, code that process goes here. You
  %% can make it return a scalar or another matrix of the same size
  pro = mean (blk.data(:));
end

然后将blockproc与所需的块大小一起使用:

B = blockproc (A(2:11,2:11), [3 3], @process_block); 

最新更新