通过将子矩阵分布到第三维来重塑矩阵

时间:2015-04-12 07:52:36

标签: matlab matrix vectorization reshape

我有一个很长的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吗?

2 个答案:

答案 0 :(得分:4)

是的,您可以使用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

答案 1 :(得分: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