使用 .* 操作将行和列向量相乘
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)
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)