2010-12-28 11 views
6

mat2cell関数を使用して、MxN行列を、同じ列サイズ、つまり、N、およそ同じ行サイズ~M/10の10個のサブ行列に分割することが可能かどうかは疑問です。 mod(M, 10) == 0の場合、すべての部分行列は同じサイズになります。そうでない場合、少数の行列は+/- 1行になります。これはmat2cell機能で可能ですか?
How to divide a matrix into equals parts?行列を等しくないサイズの部分行列に分割するにはどうすればよいですか?

答えて

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

+1 - これは私が提供したものより優れていると思います(余分な行が前面に詰まっていない限り)。 – sage

+0

@sage:MATLABの多くの問題と同様に、通常は多数の同様に優れた解決策があります。余計な行が必要な場所の問題です。 ;) – gnovice

3

これが可能であり、あなたが提供されたリンクに似ていますが、あなたが望む方法を決定する必要があります。ここで説明したように参照するために

は、行のサイズがすべて同じであれば、それは、かなり簡単ですM mod 10が0でないときに '残りの'行を分割し、10行未満であれば何をするかを指定します。

[M,N] = size(X); 
Y = mat2cell(X, [repmat(ceil(M/10),[1 mod(M,10)]) ... 
       repmat(floor(M/10),[1 10-mod(M,10)])], N);

仮定:

  1. あなたは満足している> = 10行(またはあなたが0xNアレイを持つ気にしない)
  2. を持つことになります記載されている仮定が有効である場合は、次の作業をする必要があります追加の行を最初の行列に分けます。つまり、13行の場合は、2行3つの連続した行列があり、その後に1行の7つの行列が続きます。例えば

、私は(7)X =目にこれを実行して得た:

Y = 
[1x7 double] 
    ... 
[1x7 double] 
[0x7 double] 
[0x7 double] 
[0x7 double] 
+0

ああ、非常に有益です、ありがとうございます –