Matlab 教材:Matlab 的高效能內建算子與函式

現在我們知道 Matlab 套裝軟體提供了一套程式語言, 也學會了使用這套語言寫出 for 或 while 迴圈。 但是卻要提醒讀者:非不得已,不要用 Matlab 的迴圈! Matlab 是一個陣列導向套裝軟體,它的最大強處就是高效能的陣列導向計算, 一旦用迴圈寫了指令或腳本程式,它的效能就降低了。 所以,

用 Matlab 寫 for 或 while 迴圈只是個方便法門, 可以用來解決簡單問題或者練習 for 或 while 迴圈的概念, 在 Matlab 中應盡量使用高效能的內建算子與函式,而避免迴圈。 如果非要迴圈不可,應考慮使用編譯式程式語言,例如 C 語言。

如何比較內建算子與函式和迴圈的效能?我們可以利用 tic (滴) toc (答) 這一對指令。 tic 就是把 Matlab 內建的碼表歸零、開始計時; 這個指令不會輸出任何答案。 toc 就是把碼表停止,並輸出計時的結果。讀者不妨試試看

tic toc
看到一個數,譬如 0.7963,這就是您從鍵盤輸入 toc[Enter] 所經過的時間,以秒而單位。

利用 tictoc, 我們可以替 Matlab 的工作時間計時。 以一個簡單而無聊的計算為例:計算

1 + 2 + 3 + ... + 10000
我們知道答案是 50005000,也有簡單的公式可以用,但是故意不用, 試試看 Matlab 的計算效能。

首先,利用 Matlab 算子 1:10000 產生

[1, 2, 3, ... 10000]
序列,然後利用 Matlab 內建函式 sum 計算總和, 答案放在變數 n 裡面,計時結束後印出答案檢查一下。 以下是 Matlab 的一列指令:
tic; n=sum(1:10000); toc, n
在我目前工作的電腦上,Matlab 花費的時間是 4.12 * 10-4 秒。

再來,我們用一個標準的 for 迴圈技巧來做同樣的計算:

tic;n=0; for k=1:10000, n=n+k; end; toc, n
答案當然也正確,但是在我目前工作的電腦上,Matlab 花費的時間是 0.0451 秒, 大約是前者的 109 倍!

雖然上述兩個例子花費的時間都很短 (不到 1/10 秒), 但是重點是:使用迴圈花費了 109 倍的時間。 如果計算問題更複雜,則這個倍數就會大大延長計算的時間, 而我們也就浪費了寶貴的時間。

習題

  1. 計算
    \sum_{n=1}^{1000} \frac1{n^2}
  2. 計算 x
    x = \sum_{n=1}^{500} {1\over n(n+1)}
  3. 計算 x
    \begin{displaymath}x = \sum_{n=0}^{500} {1\over 2n+1}
  4. 計算 x
    x = \sum_{n=1}^{500} {n\over n^2+1}
  5. 計算 x
    x = \sum_{n=1}^{500} {1\over n^2+1}
  6. 計算 x
    x = \sum_{n=1}^{500} {1\over 3n+1}
  7. 計算 x
    x = \sum_{n=1}^{500} {1\over n(2n+1)}
  8. 計算 x
    \begin{displaymath}x = \prod_{n=0}^{500} {4n+1\over 4n+3}
單維彰 (2004/04/28) --- [Prev] [Next] [Up]