2015-06-18 17 views

回答

2

这是因为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) 
+0

非常感谢您的解释。广播有优势/应用吗?只是好奇,知道它来得方便... – karthikeyan

+1

它可以让你不必使用像'bsxfun'这样的函数。这非常有用。 **但是**我强烈建议你不要在Octave中使用它,因为那样你就无法无故地将代码难以移植到Matlab。而是明确使用'bsxfun'。 – Dan

+0

@karthikeyan有一个很好的理由来使用它。你写'a + b - c'而不是'minus(加(a,b),c)'的原因是一样的。此外,它不是一个疯狂和独特的八度语法,它的灵感来自于numpy,它也是如此。 @Dan不使用它的唯一原因是,如果你希望代码稍后在Matlab中运行。但Octave有许多其他的功能和语法,如果是这样的话应该避免。 – carandraug