2015-04-12 55 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