MTIMESX: MATLAB快速多維矩陣乘積

Posted by Matt Wang on Friday, April 20, 2018

在多維矩陣運算當中,雖然用多個 for-loops 處理較為直觀易懂,但其實非常耗時。在我修習台大醫工所的人體動做分析電腦計算方法 時,發現了 MATLAB 有MTIMESX 這個多維矩陣乘積函式,底層為 C 語言,大幅減低了運算時間。

安裝步驟

工具包作者已經寫好安裝執行檔,只需要做幾個設定便能開始自動安裝。以下是在 MATLAB2017b 版本上的範例安裝過程。

  1. 首先,先從MTIMESX 之 Mathworks 頁面 上將其下載、解壓縮,並將資料夾改名為mtimesx:

  2. mtimesx_build.m檔案中第 166 行改成 mexopts = [prefdir '\mex_C_win64.xml'];:

  3. mtimesx資料夾移動到 MATLAB 安裝位置中的 toolbox 資料夾,它的位置大概會像是 C:\Program Files\MATLAB\R2017b\toolbox:

  4. 開啟 MATLAB,在 command window 中輸入mex -setup會顯示電腦中目前有的 Compiler。下圖是預設顯示 C compiler,輸入mex -setup C++則可以查看 C++ compiler:

  5. 輸入上一步驟中顯示的指令,選擇 C/C++ Compiler(若電腦沒有安裝 C/C++則必須先去安裝 Microsoft Visual C++),我是選擇我電腦當中 C compiler 中最新版本:

  6. 執行 mtimesx_build.m 檔案,一段時間過後最後看到"you may now use mtimesx"代表安裝成功:

  7. 在其他位置試用 mtimesx(),會顯示函式還沒被加到 MATLAB 路徑中,點擊下圖中綠框字樣便會自動加入:

使用方法與範例

必須先將兩個輸入矩陣中要做乘積的兩個維度移動到最前面(例如使用permute ),且其他對應的維度值要相同,mtimesx 會在其他維度上自動作二維乘積。

例如說現在要計算矩陣A(大小為[a,b,d1,d2,d3,...])和矩陣B(大小為[b,c,d1,d2,d3,...]),而 C=mtimesx(A,B),矩陣C的大小便為[a,c,d1,d2,d3,...]

另外,也可輸入矩陣後面加上’T’,‘C’,‘G’來分別為輸入矩陣做轉置、共軛轉置、共軛,格式為mtimesx( A [,transa] ,B [,transb] ):

MATLAB 函式同義公式
C = mtimesx(A,B)C = A * B
C = mtimesx(A,‘T’,B)C = A.’ * B
C = mtimesx(A,B,‘g’)C = A * conj(B)
C = mtimesx(A,‘c’,B,‘C’)C = A’ * B’

實際測試

當輸入矩陣的維度越多且維度值越大,mtimesx()能夠節省下來的時間就越多,如果是做 2~3 維的運算,使用mtimesx()反而會比較慢。以下是測試五維矩陣運算的執行時間比較: