【问题标题】:How to collapse an array across a specific set of dimensions?如何折叠一组特定维度的数组?
【发布时间】:2013-06-20 23:52:04
【问题描述】:

在 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 的矩阵。所以,例如,你得到 ​​p>

[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 矩阵。

谢谢

【问题讨论】:

    标签: arrays matlab multidimensional-array


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢!应该考虑重塑。 PS我只是想到了另一种似乎可行的方法:tmp = permute(M, [1,5,2,3,4]);mymatrix=tmp(:,:)。不确定它是否会一直有效?当然reshape非常更可取。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2013-04-13
    • 1970-01-01
    • 2018-10-18
    • 2021-12-31
    相关资源
    最近更新 更多