有没有一种简单的方法可以将张量(3D数组)转换为张量切片的2D数组作为MATLAB中的向量?

时间:2015-08-04 17:04:20

标签: arrays matlab

考虑尺寸为d1 x d2 x d3的3D矩阵t。有没有一种简单的方法来制作大小为d1d2 x d3的矩阵(2D阵列)?

所以天真的实现/伪代码应该是这样的:

T % d1 x d2 x d3
M % d1d2 x d3
for i=1:d3
    t_slice = t(:,:,i);
    m = reshape(t_slice, [d1d2, 1]); %columns of t_slice are the vector
    M(:,i) = m;
end

但似乎应该已经实现的东西或matlab中已经执行此操作的某些库。手动执行此操作似乎效率不高,我怀疑有一些聪明的MATLAB技巧可以做到这一点。我是对的吗?

理想情况下我想的是:

M = reshape(T,[d1d2, d3])

会存在,但不确定或无法找到它......

我实际上也想问一下,是否有可能在MATLAB中以一种很好的方式将该矩阵转换回其张量?

1 个答案:

答案 0 :(得分:2)

你的想法很好。您在底部的问题中有什么问题?

M = reshape(T, [d1*d2 d3]);

这会将3D张量中的每个2D切片展开为单个列,并将所有列堆叠在一起形成2D矩阵。我没有看到你的问题所在,除了你没有将d1d2相乘的事实。一般情况下,您需要执行此操作,给定T

M = reshape(T, [size(T,1)*size(T,2) size(T,3)]);

或者,您可以通过执行以下操作让MATLAB推断出列数:

M = reshape(T, size(T,1)*size(T,2), []);

要解决您的其他问题,要从转换后的2D矩阵返回其原始3D张量,只需执行以下操作:

T2 = reshape(M, d1, d2, d3); 

在我们的案例中,这将是:

T2 = reshape(M, size(T,1), size(T,2), size(T,3));

请记住,在执行此操作之前,您必须了解T的原始尺寸。请记住,reshape通过逐列遍历并将矩阵重新整形为您认为合适的任何维度来工作。现在,这将采用每一列并将其转换回2D切片,然后对所有列执行此操作,直到您恢复原始3D矩阵。

为了说明来回,假设我们有这个矩阵T

>> T = randi(10,3,3,3)

T(:,:,1) =

     9    10     3
    10     7     6
     2     1    10


T(:,:,2) =

    10    10     2
     2     5     5
    10     9    10


T(:,:,3) =

     8     1     7
    10     9     8
     7    10     8

要获取我们展开的切片以使它们适合列,请使用上面的第一行代码,您应该得到一个9 x 3矩阵:

>> M = reshape(T, size(T,1)*size(T,2), [])

M =

     9    10     8
    10     2    10
     2    10     7
    10    10     1
     7     5     9
     1     9    10
     3     2     7
     6     5     8
    10    10     8

正如您所看到的,每列都是从3D张量展开的切片展开为单个矢量。每列占据切片的每一列,并将它们堆叠在一起以获得单个列。

倒退:

>> T2 = reshape(M, size(T,1), size(T,2), size(T,3))

T2(:,:,1) =

     9    10     3
    10     7     6
     2     1    10


T2(:,:,2) =

    10    10     2
     2     5     5
    10     9    10


T2(:,:,3) =

     8     1     7
    10     9     8
     7    10     8

如您所见,TT2都是相同的。