Matlab 導引:複雜度

Matlab 的指令 clock 輸出 1 乘 6 的序列, 其數值依序代表:年 (西元)、月、日、時、分、秒。 前五個是正整數,但秒是浮點數。可以用 round(clock) 取得全是整數值的答案。 答案的準確性由您所用的電腦負責,因為 Matlab 是從作業系統那裡取得這些資料。 另外還有兩個指令來開始和結束碼表:

tic
將碼表歸零並開始計時。
toc
停止碼表,並輸出以秒為單位的時間。
以下是利用碼表來測量指令執行時間的例子:
>> A=rand(100,100);
>> tic; B=inv(A); det(A)*det(B), toc
ans =
    1.0000
elapsed_time =
    0.1100
碼表所記錄的時間是您真實花在電腦前面等候答案的時間。 因為個人所使用的電腦不同,甚至同一台電腦在執行上述指令時的負荷 (loading) 不同, 都會產生不同的計時結果。但是行列式的答案應該不會改變的。

另一個指令 cputime 輸出自從這一次執行 Matlab 以來, 總共使用了多少秒的 CPU 時間。例如 round(cputime/60) 會知道您這回從開始使用 Matlab 到目前為止,共用了大約幾分鐘的 CPU 時間。 我們也可以用它來測量一套指令共使用了多少 CPU 時間:
>> t=cputime; B=inv(A); det(A)*det(B), cputime-t
ans =
    1.0000
elapsed_time =
    0.0900
在微軟視窗環境的個人電腦上,CPU 時間和碼表計時的結果相差不會太大, 但是在多人多工的計算環境內,就可能有相當的出入。

用時間來估計一套指令的執行複雜度,未必是有意義的。 因為每台電腦的執行效率不同。 數學家更關心的是計算步驟數。 Matlab 內建一個計數器,記得加減乘除、次方這些基本計算步驟的次數。 指令 flops 顯示此計數器的值,而 flops(0) 將其歸零。例如
>> flops(0); 2+(3-4*5)/6; flops
ans =
     4
有一些簡單的基本函數的計算步驟被忽略,例如 exp(2.5)sin(2.5) 的計算步驟根本不計,而 sqrt(2.5) 被計一次。 有些計算步驟會取近似值,例如 sum(1:10) 明明只有 9 次加法, 但是 Matlab 算它 10 次。也就是說 sum(1:n) 就當有 n 次計算。 當 n 很大的時候,也就差不多了。例如
>> A=rand(10,10); x = rand(10,1);
>> flops(0); x'*x; flops
ans =
    20
>> flops(0); A*x; flops
ans =
   200

利用 flops 可以很方便地估計某個計算程式的複雜度 (complexity)。 通常我們假設,當輸入矩陣的維度是 NN 的時候, 一個矩陣計算的複雜度是 O(N p), 或者說計算次數大約是

C N p
其中 C 是一個正常數,N 是矩陣的維度,p 是某個整數。

以下我們示範一套實驗步驟, 用以估計 Matlab 的 inv (反矩陣) 程式之計算複雜度。 我們分別以 N=10、20、40、80 的亂數方陣做反矩陣, 並將它們的計算次數記錄在 f 序列中。
>> N=[10 20 40 80];
>> for k=1:4, A=rand(N(k),N(k)); flops(0); inv(A); f(k)=flops; end;
>> f
f =
        2601       18186      136364     1056506
光是從 f 的值,不方便看出端倪。因為實驗中的 N 以 2 的倍數成長, 根據複雜度的假設,f 的值大約是

f = ( 10p C      2p 10p C      22p 10p C      23p 10p C )
所以將其後項除以前項,得到的答案應該都是 2p, 再取 log2,就可以估計 p
>> log2(f(2:4) ./ f(1:3))
ans =
    2.8057    2.9066    2.9538
由此我們似乎可以猜想 p =3。然後就可以估計 C
>> f ./ N.^3
ans =
    2.6010    2.2732    2.1307    2.0635
由此可見 C 大約是 2。所以,Matlab 計算 NN 反矩陣的複雜度大約是
2 N 3
這是 Matlab 公司的專業人員寫的程式。換成我們自己來寫,結果未必相同。 至於這種複雜度是否最佳?有沒有可能寫出複雜度更低的反矩陣計算程式? 尤其是 p,有沒有可能 < 3? 這些問題留待數值分析或矩陣計算那些課來研讀。



[ 上一單元 ]    [ 下一單元 ]    [ 上層目錄 ]

單維彰
中央大學數學系
桃園,中壢 320
shann@math.ncu.edu.tw
(C) Copyright 2000 Wei-Chang Shann 單維彰
建立:2000/01/09‧修改:2000/01/09