2015-04-12 83 views
1

我有很長的nx3矩陣。對於例如,我採取了9x3矩陣通過將子矩陣分配到第三維來重塑矩陣

A = 

8  9  8 
9  2  9 
2  9  6 
9  9  1 
6  5  8 
1  8  9 
3  2  7 
5  4  7 
9  9  7 

現在我想它重塑,(以連續3x3子矩陣至下一個尺寸),使得

out(:,:,1) = 
8  9  8 
9  2  9 
2  9  6 
out(:,:,2) 
9  9  1 
6  5  8 
1  8  9 
out(:,:,3) 
3  2  7 
5  4  7 
9  9  7 

我可以循環做到這一點,但我想知道如何矢量化這個過程.. 我可以單獨使用reshapepermute嗎?

回答

3

是的,你可以使用permutereshape

A = [... 
8  9  8 
9  2  9 
2  9  6 
9  9  1 
6  5  8 
1  8  9 
3  2  7 
5  4  7 
9  9  7 
3  2  7 
5  4  7 
9  9  7] 

n = size(A,2); 
B = permute(reshape(A.',n,n,[]), [2 1 3]) %' 
%// or as suggested by Divakar 
%// B = permute(reshape(A,n,n,[]), [1 3 2]) 

out(:,:,1) = 

    8  9  8 
    9  2  9 
    2  9  6 

out(:,:,2) = 

    9  9  1 
    6  5  8 
    1  8  9 

out(:,:,3) = 

    3  2  7 
    5  4  7 
    9  9  7 

out(:,:,4) = 

    3  2  7 
    5  4  7 
    9  9  7 
+0

尼斯一個,你快一點。我想出了同樣的解決方案,儘管我用'numel(A)/ 9'作爲第三維,因爲OP說他有'nx3'陣列要拆分。 – hbaderts

+0

@hbaderts是的,可以概括它,我會包括它:)謝謝! – thewaywewalk

+0

@hbaderts'numel(A)/ 9'不是一個好的選擇,因爲你也需要知道** 9 **。所以'大小(A,2)'更直接。 – thewaywewalk

3

這可能是一個辦法 -

N = 3 
out = permute(reshape(A,N,size(A,1)/N,[]),[1 3 2]) 

這其中有避免轉置的優勢,因爲使用在other answer by @thewaywewalk

採樣運行 -

A = 
    8  9  8 
    9  2  9 
    2  9  6 
    9  9  1 
    6  5  8 
    1  8  9 
    3  2  7 
    5  4  7 
    9  9  7 
out(:,:,1) = 
    8  9  8 
    9  2  9 
    2  9  6 
out(:,:,2) = 
    9  9  1 
    6  5  8 
    1  8  9 
out(:,:,3) = 
    3  2  7 
    5  4  7 
    9  9  7 
+0

這當然是真的。 +1我希望你不介意,我把它也包括在我的回答中,因爲其餘的都是一樣的。 – thewaywewalk

+0

哎呀,現在我對其他答案的評論是無意義的哈哈,順便說一句,謝謝你的努力+1 :) –

+0

@thewaywewalk這很好,我想,但我想保留這個答案以及:) – Divakar