1

我有一个 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

没有替代的无循环方法吗?

4

1 回答 1

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)';
于 2013-02-16T22:01:54.930 回答