如何将向量乘以 3 次以获得 3 维矩阵
How to multiply a vector 3 times to get a 3 dimentional matrix
假设我有一个向量 B = [1; 2; 3]
。那么
B*B' = [1*1 1*2 1*3 ; 2*1 2*2 2*3 ; 3*1 3*2 3*3]
现在,我需要再次将新矩阵 B*B'
与 B
相乘,以获得以下 3 维矩阵 C
:
C(:,:,1) = [1*1*1 1*2*1 1*3*1 ; 2*1*1 2*2*1 2*3*1 ; 3*1*1 3*2*1 3*3*1]
C(:,:,2) = [1*1*2 1*2*2 1*3*2 ; 2*1*2 2*2*2 2*3*2 ; 3*1*2 3*2*2 3*3*2]
C(:,:,3) = [1*1*3 1*2*3 1*3*3 ; 2*1*3 2*2*3 2*3*3 ; 3*1*3 3*2*3 3*3*3]
我该怎么做?
(我的原始向量很长,所以我不能手动做..)
您可以使用 bsxfun
来执行这些操作。
out = bsxfun(@times, bsxfun(@times, B, B.'), reshape(B, 1, 1, []));
或者如果你想让它更清晰,你可以把它分成两个操作。先进行第一次乘法。
tmp = bsxfun(@times, B, B.');
然后再次将其乘以 B
(但我们将 B
重塑为 1 x 1 x 3
以使结果成为 3D 矩阵)
out = bsxfun(@times, reshape(B, 1, 1, []));
如果您使用的是 R2016b 或更高版本,则只需执行以下操作即可。
out = (B .* B.') .* reshape(B, 1, 1, []);
R2016b 之前:
C = bsxfun(@times, permute(B, [3 2 1]), B*B');
R2016b 之后:
C = permute(B, [3 2 1]) .* (B*B');
另一种形式是将第一次矩阵乘法的结果reshape成列,进行第二次矩阵乘法,reshape结果:
C = reshape(B*reshape(B*B.',1,[]),numel(B)*[1 1 1]);
假设我有一个向量 B = [1; 2; 3]
。那么
B*B' = [1*1 1*2 1*3 ; 2*1 2*2 2*3 ; 3*1 3*2 3*3]
现在,我需要再次将新矩阵 B*B'
与 B
相乘,以获得以下 3 维矩阵 C
:
C(:,:,1) = [1*1*1 1*2*1 1*3*1 ; 2*1*1 2*2*1 2*3*1 ; 3*1*1 3*2*1 3*3*1]
C(:,:,2) = [1*1*2 1*2*2 1*3*2 ; 2*1*2 2*2*2 2*3*2 ; 3*1*2 3*2*2 3*3*2]
C(:,:,3) = [1*1*3 1*2*3 1*3*3 ; 2*1*3 2*2*3 2*3*3 ; 3*1*3 3*2*3 3*3*3]
我该怎么做?
(我的原始向量很长,所以我不能手动做..)
您可以使用 bsxfun
来执行这些操作。
out = bsxfun(@times, bsxfun(@times, B, B.'), reshape(B, 1, 1, []));
或者如果你想让它更清晰,你可以把它分成两个操作。先进行第一次乘法。
tmp = bsxfun(@times, B, B.');
然后再次将其乘以 B
(但我们将 B
重塑为 1 x 1 x 3
以使结果成为 3D 矩阵)
out = bsxfun(@times, reshape(B, 1, 1, []));
如果您使用的是 R2016b 或更高版本,则只需执行以下操作即可。
out = (B .* B.') .* reshape(B, 1, 1, []);
R2016b 之前:
C = bsxfun(@times, permute(B, [3 2 1]), B*B');
R2016b 之后:
C = permute(B, [3 2 1]) .* (B*B');
另一种形式是将第一次矩阵乘法的结果reshape成列,进行第二次矩阵乘法,reshape结果:
C = reshape(B*reshape(B*B.',1,[]),numel(B)*[1 1 1]);