改变for循环中的步骤

时间:2013-12-15 18:11:38

标签: matlab for-loop matrix signal-processing

我有一个矩阵(大小为A和B;假设为100x100)并且想要填充大小为a和b的较小矩阵(或块)(假设为12x12)。但是,当我使用以下循环时,矩阵的边缘无法填充并且将为空。一种解决方案是使用大矩阵(例如120x120)并填充较小的块,然后最终将最终矩阵裁剪为100x100。但是,我不想使用这个解决方案。相反,我想支持边缘矩阵并使用相同的axb块。换句话说,当我到达边缘时,我想以该方向上的块大小返回并填充剩余的部分。

我完全很困惑,我应该如何在matlab代码中包含这个想法。任何想法?

M = zeros(100,100);

for i = 1:12:100-12+1
    for j = 1:12:100-12+1
        block = rand(12,12);
        M(i:i+11, j:j+11) = block;
    end;
end;

figure, imagesc(M); axis equal tight xy

2 个答案:

答案 0 :(得分:1)

在Matlab中最好not to use i and j as variable names。我正在更改为iijj

您应该做的是:选择指数ij,如下所示:

for ii = [1:12:100-12, 100-12+1]

或一般

for ii = [1:step_size_x:matrix_size_x-step_size_x, matrix_size_x-step_size_x+1]

,同样适用于jj

for jj = [1:step_size_y:matrix_size_y-step_size_y, matrix_size_y-step_size_y+1]

这可以通过单独处理特殊索引并在最后附加它来实现。

答案 1 :(得分:0)

我认为以下工作:让C = A div aD = B div b(其中div用于整数除法)。然后,使用repmat(比循环快得多),将block的CxD平铺分配为M的左下部分。然后,创建(再次,可能使用repmat,例如, repmat(block,C+1,1)),创建C + 1 x 1和1 x D + 1块瓷砖,适当地裁剪它们(使它们适合A,B)并将它们分配为顶部的“一排块”和最右边的“ M的块的一列(它将覆盖一些以前分配的值,我相信,这就是你想要的)。