0

30X35 などの非正方形サイズの行列があり、15X18 のような 4 ブロックなどのブロックに分割し、追加されたセルをゼロで埋めたいとします。これは matlab で実行できますか?

4

2 に答える 2

0

マトリックスを(2回)コピーしてから、必要な部分を0に設定することでそれを行うことができます:

m = rand([30 35]);

mLeft = m;
mLeft(1:15, :) = 0;

mRight = m;
mRight(16:end, :) = 0;

または、その逆の場合もあります。最初に 0 でいっぱいのマトリックスを作成してから、関心のあるコンテンツをコピーします。

mLeft = zeros(size(m));
mLeft(16:end, :) = m(16:end, :);

一般化は次のように行うことができます。

% find the splits, the position where blocks end
splits = round(linspace(1, numRows+1, numBlocks+1));

% and for each block
for s = 1:length(splits)-1
   % create matrix with 0s the size of m
   mAux = zeros(size(m));

   % copy the content only in block you are interested on
   mAux( splits(s):splits(s+1)-1, : ) = m( splits(s):splits(s+1)-1, : )

  % do whatever you want with mAux before it is overwriten on the next iteration
end

したがって、30x35 の例 (numRows = 30) で、6 つのブロック (numBlocks = 6) が必要であると仮定すると、分割は次のようになります。

splits =  [1     6    11    16    21    26    31]

つまり、i 番目のブロックは splits(i) で始まり、行 splits(i-1)-1 で終了します。

次に、空の行列を作成します。

mAux = zeros(size(m));

m のコンテンツを列splits(i)からsplits(i+1)-1にコピーします。

mAux( splits(s):splits(s+1)-1, : ) = m( splits(s):splits(s+1)-1, : )

この例は、すべての列にまたがるサブディビジョンが必要な場合を示しています。行と列のサブセットが必要な場合は、両方向の分割を見つけてから、次のように 2 つのネストされたループを実行する必要があります。

for si = 1:legth(splitsI)-1
for sj = 1:legth(splitsj)-1

    mAux = zeros(size(m));
    mAux( splitsI(si):splitsI(si+1)-1, splitsJ(sj):splitsJ(sj+1)-1 ) = ...
    m( splitsI(si):splitsI(si+1)-1, splitsJ(sj):splitsJ(sj+1)-1 );

end
end
于 2013-02-20T14:46:07.043 に答える
0

あなたは見ましたblockprocか?

于 2013-02-20T14:21:35.583 に答える