我有这样的代码:
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。
一般来说,我认为它不会变得更简单。
但也许你可以给它一些结构,这样它就会更干净/更容易使用。
有用的命令是reshape
或mat2cell
例如,这会将其变成一个单元格,其中 3x3 矩阵已经分组。
a = rand(11,11)
eg = mat2cell(a,[1,3,3,3,1],[1,3,3,3,1])
或者甚至将它们排列在 4D 数组中(如果您对这么多维度感到满意......
如果您考虑丢失其中一个for
循环,您可以尝试线性索引(ind2sub
和sub2ind
都用于此)。
首先,创建一个接受该大小的块的函数,并返回标量或另一个相同大小的块,如下所示:
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);