考虑尺寸为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中以一种很好的方式将该矩阵转换回其张量?
答案 0 :(得分:2)
你的想法很好。您在底部的问题中有什么问题?
M = reshape(T, [d1*d2 d3]);
这会将3D张量中的每个2D切片展开为单个列,并将所有列堆叠在一起形成2D矩阵。我没有看到你的问题所在,除了你没有将d1
和d2
相乘的事实。一般情况下,您需要执行此操作,给定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
如您所见,T
和T2
都是相同的。