poster
2019-12-10, 20:48
我想知道是否有可能使用mat2cell函数将一个划分MxN矩阵成10子矩阵与同一列大小, N ,以及大致相同的行大小~M/10 ?如果mod(M, 10) == 0那么所有子矩阵都将具有相同的大小,否则一些矩阵将具有+/- 1行。通过mat2cell函数可以做到这一点吗?
作为参考,如果行大小都相同,则相当简单,如下所示:
如何将矩阵分成相等的部分? (https://stackoverflow.com/q/1817174/52738)
回答:
这是使用linspace (https://www.mathworks.com/help/matlab/ref/linspace.html) , round (https://www.mathworks.com/help/matlab/ref/round.html)和diff (https://www.mathworks.com/help/matlab/ref/diff.html)函数的简单解决方案:
[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(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 (https://www.mathworks.com/help/matlab/ref/randperm.html)如下所示:
subSizes = diff(round(linspace(0, M, nSub+1))); cMat = mat2cell(mat, subSizes(randperm(nSub)), N);
更多&回答... (https://stackoverflow.com/questions/4550136)
作为参考,如果行大小都相同,则相当简单,如下所示:
如何将矩阵分成相等的部分? (https://stackoverflow.com/q/1817174/52738)
回答:
这是使用linspace (https://www.mathworks.com/help/matlab/ref/linspace.html) , round (https://www.mathworks.com/help/matlab/ref/round.html)和diff (https://www.mathworks.com/help/matlab/ref/diff.html)函数的简单解决方案:
[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(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 (https://www.mathworks.com/help/matlab/ref/randperm.html)如下所示:
subSizes = diff(round(linspace(0, M, nSub+1))); cMat = mat2cell(mat, subSizes(randperm(nSub)), N);
更多&回答... (https://stackoverflow.com/questions/4550136)