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

Matlab 如何将矩阵划分为大小不等的子矩阵?,matlab,matrix,cell-array,Matlab,Matrix,Cell Array,我想知道是否可以使用mat2cell函数将MxN矩阵划分为10个子矩阵,这些子矩阵的列大小相同,N,行大小大致相同~M/10?如果mod(M,10)==0则所有子矩阵将具有相同的大小,否则一些矩阵将具有+/-1行。这是否可以通过mat2cell功能实现 作为参考,如果行大小都相同,则非常简单,如下所述: 这是可能的,与您提供的链接类似,但您需要决定当M mod 10不是0时,如何分割“剩余”行,以及如果开始的行数少于10行,您将如何处理。如果所列假设有效,则以下各项应适用: [M,N] = si

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

作为参考,如果行大小都相同,则非常简单,如下所述:

这是可能的,与您提供的链接类似,但您需要决定当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);
下面是一个使用函数的简单解决方案,以及:

这种方法将以更统一的方式在单元数组的结果单元中分布额外的行。注意使用
mat=magic(5)应用上述方法时将获得的这些输出(左)和
mat=magic(13)(右):

如果您希望随机分布额外的行,可以使用如下方法:


+1-我认为这比我提供的要好(除非有人想让额外的行聚集在前面)。@sage:与MATLAB中的许多问题一样,通常有许多同样好的解决方案。这只是你想把多余的行放在哪里的问题
Y = 
 [1x7 double]
   ...
 [1x7 double]
 [0x7 double]
 [0x7 double]
 [0x7 double]
[M, N] = size(mat);  % Matrix size
nSub = 10;           % Number of submatrices
cMat = mat2cell(mat, diff(round(linspace(0, M, nSub+1))), N);
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]
subSizes = diff(round(linspace(0, M, nSub+1)));
cMat = mat2cell(mat, subSizes(randperm(nSub)), N);