如何以块为单位动态重塑矩阵?

时间:2016-11-09 13:45:08

标签: matlab matrix vectorization

我们说A = [1:8; 11:18; 21:28; 31:38; 41:48]现在我想把第4列以后的所有内容移到行位置。我如何实现这一目标?

A =
     1     2     3     4     5     6     7     8
    11    12    13    14    15    16    17    18
    21    22    23    24    25    26    27    28
    31    32    33    34    35    36    37    38
    41    42    43    44    45    46    47    48

A2 =

     1     2     3     4    
    11    12    13    14    
    21    22    23    24    
    31    32    33    34    
    41    42    43    44    
     5     6     7     8
    15    16    17    18
    35    36    37    38
    45    46    47    48

reshape似乎没有做到这一点

3 个答案:

答案 0 :(得分:8)

以下是reshapepermute -

的矢量化方法
reshape(permute(reshape(a,size(a,1),4,[]),[1,3,2]),[],4)

示例运行 -

>> a
a =
    20    79    18    82    27    23    59    66    46    21    48    95
    96    83    46    49    34    88    23    42    17    27    15    54
    11    88    34    92    23    62    86    56    32    32    91    54
>> reshape(permute(reshape(a,size(a,1),4,[]),[1,3,2]),[],4)
ans =
    20    79    18    82
    96    83    46    49
    11    88    34    92
    27    23    59    66
    34    88    23    42
    23    62    86    56
    46    21    48    95
    17    27    15    54
    32    32    91    54

答案 1 :(得分:3)

使用Matrix indexing

B=[A(:,1:4);A(:,5:8)]

循环......

for ii=0:floor(size(A,2)/4)-1
   B([1+5*ii:5*(ii+1)],:)=A(:,[1+4*ii:4*(ii+1)] );
end

答案 2 :(得分:2)

还有一个......也许是未优化的方法是将矩阵分解成单元格,然后转换单元格数组,然后将所有内容连接起来:

B = cell2mat(mat2cell(A, size(A, 1), 4 * ones((size(A, 2) / 4), 1)).');

以上首先使用mat2cell将矩阵分解为非重叠的单元格。每个单元格的行数与A相同,但列总数为4,其中只有size(A, 2) / 4。因此,我们需要指示一个向量,其中每个元素为4,并且这些元素中有size(A, 2) / 4告诉我们每个单元格的列数。这会创建一个行方式的单元格数组,因此我们转置此单元格数组并将所有单元格合并为一个cell2mat的最终矩阵。