1

私は105x105の行列B(実際には連結された<3x3>行列の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; 000]になります

[1 0 0; 0 0 0; 0 0 0]、これは[1 1 1; 0 0 0; 000]になります

[0 0 0; 0 1 0; 0 0 0]、これは[0 0 0; 1 1 1; 000]になります

[0 0 0; 0 0 0; 0 0 1]、これは[0 0 0; 0 0 0; 111]になります

[1 0 0; 0 1 0; 0 0 0]、これは[1 1 1; 1 1 1; 000]になります

[1 0 0; 0 0 0; 0 0 1]、これは[1 1 1; 0 0 0; 111]になります

[0 0 0; 0 1 0; 0 0 1]、これは[0 0 0; 1 1 1; 111]になります

および[100; 0 1 0; 0 0 1]は、[1 1 1; 1 1 1; 111]になります。

私は[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

1つの解決策は、再割り当てが簡単になるようにアレイの形状を変更することです。

%# 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 に答える