6

関数を使用して、行列を同じ列サイズ、およびほぼ同じ行サイズの 10 個の部分行列mat2cellに分割できるかどうか疑問に思っています。その場合、すべてのサブマトリックスが同じサイズになります。そうでない場合、いくつかのマトリックスが +/-1 行になります。これは関数を介して可能ですか?MxNN~M/10mod(M, 10) == 0mat2cell

参考までに、行のサイズがすべて同じである場合は、ここで説明されているように、かなり簡単です:
行列を等しい部分に分割する方法は?

4

2 に答える 2

5

linspace関数、round、およびを使用した簡単なソリューションを次に示しますdiff

[M, N] = size(mat);  % Matrix size
nSub = 10;           % Number of submatrices
cMat = mat2cell(mat, diff(round(linspace(0, M, nSub+1))), N);

このアプローチにより、セル配列の結果のセル全体に、より均一な方法で余分な行が分散されます。mat = magic(5);(左) とmat = magic(13);(右)を使用して上記を適用すると得られる出力に注意してください。

cMat =              cMat = 

    [1x5 double]        [1x13 double]
    [0x5 double]        [2x13 double]
    [1x5 double]        [1x13 double]
    [0x5 double]        [1x13 double]
    [1x5 double]        [2x13 double]
    [0x5 double]        [1x13 double]
    [1x5 double]        [1x13 double]
    [0x5 double]        [1x13 double]
    [1x5 double]        [2x13 double]
    [0x5 double]        [1x13 double]

余分な行をランダムに分散させたい場合は、次のrandpermように使用できます。

subSizes = diff(round(linspace(0, M, nSub+1)));
cMat = mat2cell(mat, subSizes(randperm(nSub)), N);
于 2010-12-29T03:57:14.733 に答える
3

これは可能であり、提供したリンクに似ていますが、M mod 10 が 0 でない場合に「残りの」行を分割する方法と、最初に 10 行未満の場合に何をするかを決定する必要があります。 . リストされた仮定が有効な場合、以下が機能するはずです。

[M,N] = サイズ(X);
Y = mat2cell(X, [repmat(ceil(M/10),[1 mod(M,10)]) ...
                 repmat(床(M/10),[1 10-mod(M,10)])], N);

仮定:

  1. >= 10 行になります (または、0xN 配列を使用してもかまいません)。
  2. 追加の行を最初の行列に分割することに満足しています。つまり、13 行ある場合、2 行の 3 つの連続した行列があり、その後に 1 行の 7 つの行列が続きます。

たとえば、これを X = eye(7) で実行すると、次のようになりました。

Y = 
 [1x7 double]
   ...
 [1x7 double]
 [0x7 double]
 [0x7 double]
 [0x7 double]
于 2010-12-28T23:03:20.380 に答える