a =
1
2
3
b =
1 2 3
a.*b
ans =
1 2 3
2 4 6
3 6 9
我使用。*运算符在Octave中乘以行向量和列向量来查看结果。我不明白答案是如何获得的。
答案 0 :(得分:2)
这是因为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- 3 矩阵的乘积将具有维数< em> 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)然后以元素方式应用运算符。在你的情况下,你有两个单独维度的矩阵(即columan向量和行向量),所以它实际上广播了两次你有效(但请注意,它实际上并没有扩展内存中的矩阵,并且通常比使用{{ 1}})获取
repmat
产生你看到的结果。
在matlab中,为了获得相同的结果,您必须显式调用[1,2,3;1,2,3;1,2,3].*[1,1,1;2,2,2;3,3,3]
函数(二进制单例扩展函数),如下所示:
bsxfun