LAPACK(線性代數套裝軟體)
/ ELL-a-pack /
幾乎每一個正經的科學軟體,無論你是用 MATLAB、Python、R 還是 Julia 寫的,最終都倚賴同一組久經考驗的常式來扛起線性代數的重活。LAPACK——是 Linear Algebra PACKage(線性代數套裝軟體)的縮寫——就是那組常式。它是一個免費、開放、用 Fortran 寫成的函式庫,歷經數十年打磨,解決數值計算中日常的主力工作:線性方程組、最小平方問題、特徵值與特徵向量,以及奇異值分解。當你在高階語言裡呼叫 solve、eig 或 svd 時,通常是某個 LAPACK 常式在做事。
讓 LAPACK 重要的,除了免費之外,是它「怎麼」被建造的。它用 BLAS 呼叫來表達自己的演算法——而且關鍵地,是用第三級 BLAS(Level-3),也就是一次搬動大塊數字的矩陣-矩陣運算。這種「分塊」設計意味著 LAPACK 在裝得進快取的小塊上做算術,因此免費地取得了調校過的 BLAS 大部分的速度。它的常式遵循一套整齊的命名規則:像 dgesv 這樣的名字讀作 d(雙精度)、ge(一般矩陣)、sv(解線性方程組);dpotrf 是 d、po(對稱正定)、trf(三角分解,即喬列斯基分解)。一旦學會這套代碼,整個函式庫的目錄就變得可讀。LAPACK 是更早的 LINPACK 與 EISPACK 的後繼者,於一九八〇年代末重新設計,正是為了讓內層迴圈在現代機器上對快取友善。
更深的價值在於正確性與謹慎。LAPACK 的常式由頂尖的數值分析學者撰寫,體現了向後誤差分析、謹慎的樞紐選擇,以及邊界情況的處理(溢位、下溢、縮放)——這些是手寫版本幾乎永遠做不對的。許多常式在給出答案的同時,會附帶條件數估計或誤差界,讓你知道該信任它多少——這正是本領域所在意的可信度紀律。誠實的提醒:LAPACK 針對的是單一共享記憶體機器上的「稠密」矩陣(稀疏與大規模平行問題需要別的函式庫,如 SuiteSparse、PETSc 或 ScaLAPACK),而且它畢竟是用 Fortran 以欄為主(column-major)的慣例寫成的,以列為主的呼叫端(C、Python)必須尊重這一點,否則就會默默地轉置。
常式 dgesv 為一個一般的雙精度矩陣解 A x = b。它內部先呼叫 dgetrf(帶部分樞紐選擇的 LU 分解,以分塊的第三級 BLAS 表達),再呼叫 dgetrs(前代與回代)。MATLAB 的反斜線、SciPy 的 linalg.solve、R 的 solve,最終都導向這裡——你幾乎從不需要自己寫那個 LU。
一道 LAPACK 呼叫(dgesv)把分塊 LU 分解與三角求解串起來,全都建立在 BLAS 之上。
LAPACK 對病態問題並非萬靈丹:它給的是向後穩定的答案,即某個鄰近問題的精確解,但若你的矩陣病態,向前誤差仍可能很大。那是問題本身的錯,不是 LAPACK 的錯——而且好幾個常式會透過回傳的條件數估計告訴你這件事。