有没有更简单的方法通过Matlab迭代2-D数组?

时间:2014-04-02 12:47:43

标签: arrays matlab

我有这样的代码:

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

通过" 3-by-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个。)

4 个答案:

答案 0 :(得分:1)

您可以获得A的一部分:

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

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

答案 1 :(得分:1)

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

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

您也可以像这样修改Matrix A:

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

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

答案 2 :(得分:0)

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

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

有用的命令是reshapemat2cell

例如,这将把它变成一个3x3矩阵已经分组的单元格。

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

甚至将它们安排在一个4d阵列中(如果你对这么多维度感到满意......)

如果您考虑丢失其中一个for循环,可以试用linear indexingind2subsub2ind就可以了。)

答案 3 :(得分:0)

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

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);