2014年10月26日 星期日

[matlab教學]如何區分矩陣乘法(*)及矩陣逐元素乘法(.*)的不同

最近有朋友丟了一段matlab程式碼給柚子,看看柚子能不能幫他debug一下,逐行debug之後沒有發現bug,最後請朋友給初始數據及他想要的最後應得結果,柚子採人工方式逐行驗算,才發現有個糊塗蛋把 * 及 .* 運算元搞混淆了,也就是朋友要做的是矩陣逐元素乘法(Element-Wise Multiplication)(matlab中的運算元為 .* ,函數為 times),而不是在線性代數中所定義的矩陣乘法(Matrix Multiplication)(matlab中的運算元為 * ,函數為 mtimes)。由於朋友是直接使用運算元來表示指令,因此忽略了「 . 」這個字元,所算出來的值當然就會有所不同,為了避免混淆我們也可以利用matlab內建函數:mtimes函數及times函數,來區分這二個運算元 * 和 .* 的不同性。

方法

步驟 1 首先我們先建立二個矩陣 a 和 b,在 matlab 的 Command Window 分別輸入 a=[1 2;3 4] 及 b=[5 6;7 8] 指令,可得下圖結果。


步驟 2 先來看看矩陣相乘的運算結果,輸入 c=a*b 指令,其中 c 矩陣是運算結果,當然你也可以輸入 c=mtimes(a,b) 指令,也會得到相同結果。從下圖結果可知 c(1,1)=a(1,1)*b(1,1)+a(1,2)*b(2,1)=19。


步驟 3 再來看看矩陣逐元素乘法的運算結果,輸入 d=a.*b 指令,為了與步驟2的運算結果比較,我們用另一個 d 矩陣來表示運算結果,當然你也可以輸入 d=times(a,b) 指令,也會得到相同結果。從下圖結果可知 d(1,1)=a(1,1)*b(1,1)=5。從步驟2及3的結果,不知大家是否釐清這二個運算元的不同性了?