2016-11-09 59 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