【问题标题】:How can I divide a matrix into unequally-sized submatrices?如何将矩阵划分为大小不等的子矩阵?
【发布时间】:2011-05-31 19:28:21
【问题描述】:

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

作为参考,如果行大小都相同,则相当简单,如下所述:
How to divide a matrix into equals parts?

【问题讨论】:

    标签: matlab matrix cell-array


    【解决方案1】:

    这是一个使用函数linspacerounddiff的简单解决方案:

    [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);
    

    【讨论】:

    • +1 - 我认为这比我提供的要好(除非希望将额外的行聚集在前面)。
    • @sage:与 MATLAB 中的许多问题一样,通常有许多同样好的解决方案。这只是您想要额外行的位置的问题。 ;)
    【解决方案2】:

    这是可能的,并且类似于您提供的链接,但是您需要决定当 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      相关资源
      最近更新 更多