2016-11-09 26 views
2

假设我有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似乎并没有这样的伎俩

+1

[这个问题](http://stackoverflow.com/q/40506417/1085062)是相关的(如果不重复) –

回答

6

下面是与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 
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 
+0

我可以不使用循环动态地执行此操作吗? 'A'可能有几千列,我需要每四列减少一列。 –

+0

@Jdane你走了,但像往常一样,Divakar有更好的答案! –

+0

感谢您的帮助!你给了我更多的选择来解决这个问题! –

2

还有一..也许是不合时宜的timized方法是将基质分解成细胞逐行,转置则单元阵列串联一切回到一起:

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