2015-06-18 21 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