a =
1
2
3
b =
1 2 3
a.*b
ans =
1 2 3
2 4 6
3 6 9
我使用。*运算符在八度中乘以行向量和列向量以查看结果。我不明白答案是如何得到的。使用。*操作的行和列向量的多行行为
a =
1
2
3
b =
1 2 3
a.*b
ans =
1 2 3
2 4 6
3 6 9
我使用。*运算符在八度中乘以行向量和列向量以查看结果。我不明白答案是如何得到的。使用。*操作的行和列向量的多行行为
这是因为Octave(与Matlab的显着区别)automatically broadcasts。
Octave中的*
运算符是matrix multiplication运算符。所以你的情况a*b
将输出(在Matlab为好)
a*b
ans =
1 2 3
2 4 6
3 6 9
应预期。一个 -by- 矩阵的与 -by- 矩阵的产品将具有尺寸 -by- (内部尺寸必须匹配,结果取的外部尺寸)。
然而.*
运算符是元素明智的乘法操作。这意味着不是矩阵乘法,而是将两个输入的每个相应元素与矩阵的其余部分无关地相乘。所以[1,2,3].*[1,2,3]
(或a'.*b
)结果为[1,4,9]
。再次,这是在Matlab和八度。
使用基于元素的操作时,重要的是输入的维度完全匹配。所以[1,2,3].*[1,2]
将通过一个错误,因为尺寸不匹配。在Matlab中,您的a.*b
也会发生错误。然而在八度它不会,它会自动播出。你可以想象这就好像它接受你的一个输入并在单一维上复制它(所以在一个列矢量中,第二个维是一个单一维,因为它的大小是1),然后以元素方式应用运算符。在你的情况下,你有两个单一维度的矩阵(即columan矢量和一个行矢量),所以它实际上广播了两次,而且有效(但是请注意,它实际上并没有在内存中扩展矩阵,并且通常比使用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)
非常感谢您的解释。广播有优势/应用吗?只是好奇,知道它来得方便... – karthikeyan
它可以让你不必使用像'bsxfun'这样的函数。这非常有用。 **但是**我强烈建议你不要在Octave中使用它,因为那样你就无法无故地将代码难以移植到Matlab。而是明确使用'bsxfun'。 – Dan
@karthikeyan有一个很好的理由来使用它。你写'a + b - c'而不是'minus(加(a,b),c)'的原因是一样的。此外,它不是一个疯狂和独特的八度语法,它的灵感来自于numpy,它也是如此。 @Dan不使用它的唯一原因是,如果你希望代码稍后在Matlab中运行。但Octave有许多其他的功能和语法,如果是这样的话应该避免。 – carandraug