我想知道是否可以使用mat2cell
函数将MxN
矩阵划分为10个子矩阵,这些子矩阵具有相同的列大小N
,并且行大小大致相同{ {1}}?如果~M/10
则所有子矩阵将具有相同的大小,否则一些矩阵将具有+/- 1行。这可以通过mod(M, 10) == 0
函数吗?
作为参考,如果行大小都相同,那么它非常简单,如下所述:
How to divide a matrix into equals parts?
答案 0 :(得分: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]
如果您更喜欢随机分配额外行,可以像{{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);
假设:
例如,我在X = eye(7)上运行它并得到:
Y =
[1x7 double]
...
[1x7 double]
[0x7 double]
[0x7 double]
[0x7 double]