2013-02-16 122 views
1

我有一个105x105的矩阵B(实际上是一个连接的矩阵的35x35组),我必须根据一个规则改变其元素< 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 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; 111]; 111 0

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

我使用[1 1 1]*any(submatrix,2)改变值累计。到规则,它工作正常。但我使用下面的循环遍历所有的子矩阵:

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 

是不是有一个替代loopless方法做到这一点?

回答

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)'; 
+0

它完美。你是怎么想出这样的解决方案的? – 2013-02-16 23:09:24

+0

@KunalRmth:我只是在考虑操作是什么(如果它包含一个操作,就填充一行),然后想知道如何安排原始数组以便于操作。此外,我真的很好用Matlab;) – Jonas 2013-02-17 01:17:28

+0

,因为你是如此优秀的Matlab,请参阅真的需要一些环removings。 – 2013-02-17 22:50:08