6

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

作为参考,如果行大小都相同,则相当简单,如下所述:
如何将矩阵划分为相等的部分?

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 行,那么您有 3 个连续的 2 行矩阵,然后是 7 个 1 行的矩阵。

例如,我在 X = eye(7) 上运行它并得到:

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