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