使用 .* 操作将行和列向量相乘

Multipling row and column vector using .* operation

a =

1
2
3

b =

1   2   3

a.*b
ans =

1   2   3
2   4   6
3   6   9

我使用 .* 运算符在 Octave 中将行向量和列向量相乘以查看结果。不明白答案是怎么得来的

这是因为 Octave(与 Matlab 有显着差异)automatically broadcasts

Octave 中的 * 运算符是 matrix multiplication 运算符。所以在你的情况下 a*b 会输出(在 Matlab 中也是如此)

a*b
ans =

1   2   3
2   4   6
3   6   9

这是意料之中的事情。 3-by-1 矩阵与 1-by-[=39= 的乘积]3 矩阵的维度为 3-by-3(内部维度必须匹配,结果采用外部维度)。

然而,.* 运算符是 元素方面的 乘法运算。这意味着不是矩阵乘法,而是将两个输入的每个对应元素相乘,独立于矩阵的其余部分。所以 [1,2,3].*[1,2,3](或 a'.*b)导致 [1,4,9]。同样,这是在 Matlab 和 Octave 中。

使用逐元素运算时,输入的维度必须完全匹配,这一点很重要。所以 [1,2,3].*[1,2] 将通过一个错误,因为维度不匹配。在 Matlab 中,您的 a.*b 也会出错。但是在 Octave 中它不会,而是会自动广播。您可以想象这就好像它采用您的输入之一并将其复制到单一维度(因此在列向量中,第二个维度是单一维度,因为它的大小为 1),然后按元素应用运算符。在您的情况下,您有两个具有单一维度的矩阵(即列向量和行向量),因此它实际上广播了两次并且您有效(但请注意,它实际上并没有扩展内存中的矩阵并且通常比使用 repmat) 得到

[1,2,3;1,2,3;1,2,3].*[1,1,1;2,2,2;3,3,3]

这会产生您所看到的结果。

在 matlab 中,要获得相同的结果,您必须显式调用 bsxfun 函数(二进制单例扩展函数),如下所示:

bsxfun(@times, a, b)