如何在特定维度上对数组进行折叠?

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 的第一维和第二维的“展平”,但保留其他任何维度。
实际上,我需要对一个五维数组的“中间三个维度”执行此操作,因此通用解决方案会很好!例如,W = rand(N,N,N,N,N); mymatrix = W( :, :::, : ) 应该给出一个 N x N^3 x N 矩阵,如果你明白我的意思的话。
谢谢。
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自动计算大小。请注意,您只能使用一个[]。所有其他维度长度都必须明确指定。


太好了,谢谢!应该考虑重构。补充一下,我刚想到另一种方法,似乎可以工作:tmp = permute(M,[1,5,2,3,4]);mymatrix=tmp(:,:)。不确定它是否总是有效的?当然,“reshape” 更加可取。 - Sanjay Manohar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接