如何将矩阵划分为不等大小的子矩阵?

时间:2010-12-28 22:45:37

标签: matlab matrix cell-array

我想知道是否可以使用mat2cell函数将MxN矩阵划分为10个子矩阵,这些子矩阵具有相同的列大小N,并且行大小大致相同{ {1}}?如果~M/10则所有子矩阵将具有相同的大小,否则一些矩阵将具有+/- 1行。这可以通过mod(M, 10) == 0函数吗?

作为参考,如果行大小都相同,那么它非常简单,如下所述:
How to divide a matrix into equals parts?

2 个答案:

答案 0 :(得分:5)

这是使用linspacerounddiff函数的简单解决方案:

[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]

如果您更喜欢随机分配额外行,可以像{{p}}那样使用randperm

subSizes = diff(round(linspace(0, M, nSub+1)));
cMat = mat2cell(mat, subSizes(randperm(nSub)), N);

答案 1 :(得分: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行,那么您有3个连续的矩阵,其中包含2行,后面是7行矩阵,每行1行。
  3. 例如,我在X = eye(7)上运行它并得到:

    Y = 
     [1x7 double]
       ...
     [1x7 double]
     [0x7 double]
     [0x7 double]
     [0x7 double]
    
相关问题