我有这样的代码:
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个。)
答案 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)
一般说我不认为它变得更简单。
但也许你可以给它一些结构,这样它就会更清洁/更容易使用。
有用的命令是reshape
或mat2cell
例如,这将把它变成一个3x3矩阵已经分组的单元格。
a = rand(11,11)
eg = mat2cell(a,[1,3,3,3,1],[1,3,3,3,1])
甚至将它们安排在一个4d阵列中(如果你对这么多维度感到满意......)
如果您考虑丢失其中一个for
循环,可以试用linear indexing(ind2sub
和sub2ind
就可以了。)
答案 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);