根据子矩阵规则更改大矩阵的元素

时间:2013-02-16 21:19:33

标签: matlab optimization for-loop

我有一个105x105的矩阵B(实际上是一个35x35组的< 3x3>矩阵连接在一起),我必须根据一个适用于< 3x3>的规则来改变它的元素。矩阵。

鉴于任何子矩阵每行只能有“1”,而“1”只能出现在(1,1)和/或(2,2)和/或(3,3)。

因此唯一可能的子矩阵是

[0 0 0; 0 0 0; 0 0 0],变为[0 0 0; 0 0 0; 0 0 0]

[1 0 0; 0 0 0; 0 0 0],变为[1 1 1; 0 0 0; 0 0 0]

[0 0 0; 0 1 0; 0 0 0],变为[0 0 0; 1 1 1; 0 0 0]

[0 0 0; 0 0 0; 0 0 1],变为[0 0 0; 0 0 0; 1 1 1]

[1 0 0; 0 1 0; 0 0 0],变为[1 1 1; 1 1 1; 0 0 0]

[1 0 0; 0 0 0; 0 0 1],变为[1 1 1; 0 0 0; 1 1 1]

[0 0 0; 0 1 0; 0 0 1],变为[0 0 0; 1 1 1; 1 1 1]

和[1 0 0; 0 1 0; 0 0 1],变为[1 1 1; 1 1 1; 1 1 1]

我正在使用[1 1 1]*any(submatrix,2)更改值acc。规则,它工作正常。但是我使用以下循环来遍历所有子矩阵:

    for i=1:3:103
     for j=1:3:103
      temp=A(i:i+2,j:j+2);
      temp=[1 1 1]*any(temp,2);
      A(i:i+2,j:j+2)=temp
     end
    end

是否有另一种无环路方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

一种解决方案是重新整形数组,以便重新分配变得容易:

%# remember size of A
[nRows,nCols] = size(A);

%# reshape A to 3xn
%# transpose so that we get each "row" as a separate column
temp = reshape(A',3,[]);

%# overwrite temp with the rows filled in 
temp = repmat(any(temp,1),3,1);

%# reshape to recreate the original array
%# and transpose
B = reshape(temp,nRows,nCols)';