8

在 Matlab 中,我们可以像这样跨维度折叠数组:

M     = rand(3,4,5);
myvec = M(:);        % gives a 60-element vector

我认为这称为序列化或扁平化。元素的顺序是首先是 dim1,然后是 dim2,然后是 dim3 - 所以你得到[M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...].

但我想做的是沿着前两个维度折叠:

mymatrix = M( :: , : ); % something that works like this?

给出一个 12 x 5 的矩阵。所以,例如,你得到

[M(1,1,1)  M(1,1,2)  M(1,1,3)  M(1,1,4)  M(1,1,5)
 M(2,1,1)  M(2,1,2)  M(2,1,3)  M(2,1,4)  M(2,1,5)
 M(3,1,1)  M(3,1,2)  M(3,1,3)  M(3,1,4)  M(3,1,5)
 M(1,2,1)  M(1,2,2)  M(1,2,3)  M(1,2,4)  M(1,2,5)
 ...
]

所以第一个维度mymatrix是原始的“扁平化”的第一个和第二个维度M,但保留任何其他维度。

我实际上需要为 5 维数组的“中间 3 维”执行此操作,因此通用解决方案会很棒!如果你明白我的意思,例如W=rand(N,N,N,N,N); mymatrix = W( :, :::, : )应该给出一个矩阵。N x N^3 x N

谢谢

4

1 回答 1

5

使用reshape方括号 ( []) 作为维度长度参数之一的占位符:

sz = size( M );
mymatrix = reshape( M, [], sz(end) );        % # Collapse first two dimensions

或者

mymatrix = reshape( M, sz(1), [], sz(end) ); % # Collapse middle dimensions

占位符[]告诉reshape自动计算大小。请注意,您只能使用一次出现的[]. 所有其他尺寸长度必须明确指定。

于 2013-06-24T12:58:47.320 回答