在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
矩阵。
由于
答案 0 :(得分: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
自动计算尺寸。请注意,您只能使用一次[]
次。必须明确指定所有其他尺寸长度。