我想知道是否可以使用该mat2cell
函数将MxN
矩阵划分为 10 个具有相同列大小N
和大致相同行大小的子矩阵~M/10
?如果mod(M, 10) == 0
那么所有子矩阵将具有相同的大小,否则一些矩阵将具有 +/-1 行。这可以通过mat2cell
函数实现吗?
作为参考,如果行大小都相同,则相当简单,如下所述:
如何将矩阵划分为相等的部分?
我想知道是否可以使用该mat2cell
函数将MxN
矩阵划分为 10 个具有相同列大小N
和大致相同行大小的子矩阵~M/10
?如果mod(M, 10) == 0
那么所有子矩阵将具有相同的大小,否则一些矩阵将具有 +/-1 行。这可以通过mat2cell
函数实现吗?
作为参考,如果行大小都相同,则相当简单,如下所述:
如何将矩阵划分为相等的部分?
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);
这是可能的,并且类似于您提供的链接,但是您需要决定当 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);
假设:
例如,我在 X = eye(7) 上运行它并得到:
Y =
[1x7 double]
...
[1x7 double]
[0x7 double]
[0x7 double]
[0x7 double]