線性代數中，科列斯基分解是指將一個正定的埃爾米特矩陣分解成一個下三角矩陣與其共軛轉置之乘積。這種分解方式在提高代數運算效率、蒙特卡羅方法等場閤中十分有用。實數矩陣的科列斯基分解由安德烈 路易科列斯基最先發明。實際應用中，科列斯基分解在求解線性方程組中的效率約兩倍於 LU 分解。 描述 對正定埃爾米特矩陣 mathbf A 進行科列斯基分解，即求矩陣 mathbf L 使下式成立 mathbf Amathbf LL 其中，mathbf L 是一個下三角矩陣且所有對角元素均為正實數，mathbf L 表示 mathbf L 的共軛轉置。每一個正定埃爾米特矩陣都有一個唯一的科列斯基分解。 當矩陣 mathbf A 是一個半正定的埃爾米特矩陣，若允許 mathbf L 的對角線元素為零，則 mathbf A 也存在上述形式的分解。 當 mathbf A 為實數矩陣，則 mathbf L 也為實數矩陣且科列斯基分解可改寫成 mathbf Amathbf LLmathbf T。 當 mathbf A 是正定矩陣時，科列斯基分解是唯一的，即只存在一個對角元素均嚴格大於零的下三角矩陣，使 mathbf Amathbf LL 成立。然而，當 mathbf A 是半正定時，分解則不一定是唯一的。 定理的逆命題自然成立：對於某些可逆矩陣 mathbf L（下三角矩陣或其他矩陣），如果 mathbf A 可被寫成 mathbf LL，則 mathbf A 是一個正定的埃爾米特矩陣。 LDL 分解 經典科列斯基分解的一個變形是 LDL 分解，即 mathbf Amathbf LDL 其中，mathbf L 是一個單位下三角矩陣，mathbf D 是一個對角矩陣。 該分解與經典科列斯基分解猶有關聯，如下： mathbf Amathbf LDLmathbf LDfrac 12mathbf Dfrac 12mathbf Lmathbf LDfrac 12 mathbf LDfrac 12 或者，由於 mathbf L 的對角元素必須為 1，且 mathbf LCholesky 與 mathbf L 都是下三角矩陣，故如果已知經典科列斯基分解 mathbf LCholesky，則 mathbf LDL T 形式可依下式求出，設 S 是包含 mathbf L Cholesky 的對角元素的對角矩陣， mathbf D mathbf S2 mathbf L mathbf LCholesky mathbf S1 LDL 變形如果得以有效執行，構造及使用時所需求的空間及計算的複雜性與經典科列斯基分解是相同的，但是可避擴音取平方根。某些不存在科列斯基分解的不定矩陣，也可以執行 LDL 分解，此時矩陣 mathbf D 中會出現負數元素。因此人們更傾向於使用 LDL 分解。對於實數矩陣，該種分解的形式可被改寫成 mathbf Amathbf LDLmathbf T 此形式通常稱為 LDLT 分解（或 LDLT 分解）。它與實對稱矩陣的特徵分解密切相關，因為對於實對稱矩陣，存在特徵分解 mathbf Amathbf QLambda Qmathbf T。 例項 以下乃一個實對稱矩陣的科列斯基分解 begin align left begin array3r 4 12 16 12 37 43 16 43 98 end array right left begin array3r 2 0 0 6 1 0 8 5 3 end array right left begin array3r 2 6 8 0 1 5 0 0 3 end array right end align 以下乃其 LDLT 分解 begin align left begin array3r 4 12 16 12 37 43 16 43 98 end array right left begin array3r 1 0 0 3 1 0 4 5 1 end array right left begin array3r 4 0 0 0 1 0 0 0 9 end array right left begin array3r 1 3 4 0 1 5 0 0 1 end array right end align 應用 科列斯基分解主要被用於線性方程組 mathbf Ax mathbf b 的求解。如果 A 是對稱正定的，我們可以先求出 mathbf Amathbf LLmathbf T，隨後借向後替換法對 y 求解 mathbf Lymathbf b，再以向前替換法對 x 求解 mathbf Lmathbf Tmathbf x mathbf y 即得最終解。 另一種可避免在計算 mathbf LLmathbf T 時需要解平方根的方法就是計算 mathbf A mathbf LDLmathrm T，然後對 y 求解 mathbf Ly mathbf b，最後求解 mathbf DLmathrm Tmathbf x mathbf y 對於可以被改寫成對稱矩陣的線性方程組，科列斯基分解及其 LDL 變形是一個較高效率及較高數值穩定性的求解方法。相比之下，其效率幾近為 LU 分解的兩倍。 矩陣求逆 若欲對埃爾米特矩陣直接求逆，可以透過科列斯基分解，類似求解線性方程組一般求出逆矩陣，這需要 n3 次運算（frac 12 n3 次乘法運算）。 該方法即便要求逐步計算也非常有效率。 非埃爾米特矩陣 mathbf B 也可以透過下例性質求逆，因為其中 mathbf BB 總是埃爾米特矩陣 mathbf B1mathbf Bmathbf BB1 計算 有各種各樣的方法用於計算科列斯基分解。 常用的演演算法的計算複雜度在一般情況下為 O n3。 下面的演算法何者較快取決於執行時的具體條件。總體而言，第一個演算法會稍慢，因為其以一種不太尋常的方式讀取資料。 科列斯基演算法 用於計算矩陣 mathbf L 的科列斯基演算法，是以高斯消元法為基礎而調整得來的。 遞迴演算法由 i1 開始，令 mathbf A1mathbf A 在步驟 i，矩陣 Ai 的形式如下： mathbf Ai begin pmatrix mathbf I_i1 0 0 0 a_ii mathbf b_i 0 mathbf b_i mathbf Bi end pmatrix 其中，mathbf I_i1 代表 i1 維的單位矩陣。 此時定義矩陣 mathbf L_i 為 mathbf L_i begin pmatrix mathbf I_i1 0 0 0 sqrt a_ii 0 0 frac 1sqrt a_ii mathbf b_i mathbf I_ni end pmatrix 隨即 mathbf Ai 可以被改寫成 mathbf Ai mathbf L_i mathbf Ai1 mathbf L_i 其中 mathbf Ai1 begin pmatrix mathbf I_i1 0 0 0 1 0 0 0 mathbf Bi frac 1a_ii mathbf b_i mathbf b_i end pmatrix 注意在此 mathbf b_imathbf b_i 是一個外積。 重複此步驟直到 i 從 1 到 n。n 步之後，我們得到 An1 mathbf I。因此，所求的下三角矩陣 L 為 mathbf L mathbf L_1 mathbf L_2 dots mathbf L_n 科列斯基 巴那齊耶維茨及科列斯基 克勞特演演算法 寫出等式 mathbf Amathbf LL， begin align mathbf ALLT begin pmatrix mathbf L_11 0 0 mathbf L_21 mathbf L_22 0 mathbf L_31 mathbf L_32 mathbf L_33 end pmatrix begin pmatrix mathbf L_11 mathbf L_21 mathbf L_31 0 mathbf L_22 mathbf L_32 0 0 mathbf L_33 end pmatrix begin pmatrix mathbf L_112 text symmetric mathbf L_21mathbf L_11 mathbf L_212 mathbf L_222 mathbf L_31mathbf L_11 mathbf L_31mathbf L_21mathbf L_32mathbf L_22 mathbf L_312 mathbf L_322mathbf L_332 end pmatrix end align 則得到矩陣 mathbf L 的元素的計算公式如下 mathbf L_jj sqrt A_jj sum_k1j1mathbf L_jk2 mathbf L_ij frac 1mathbf L_jj left A_ij sum_k1j1 mathbf L_ikmathbf L_jk right qquadtext for ij 只要 mathbf A 是實數正定矩陣，則平方根下的表示式恆為正。 對於複埃爾米特矩陣，則適用如下公式： mathbf L_jj sqrt A_jj sum_k1j1mathbf L_jkmathbf L_jk mathbf L_ij frac 1mathbf L_jj left mathbf A_ij sum_k1j1mathbf L_ikmathbf L_jk right qquadtext for ij 因此，要計算 mathbf L_ijineq j 只需利用其的左、上方元素的值。計算通常是以以下其中一種順序進行的。 科列斯基 巴那齊耶維茨演演算法從矩陣 L 的左上角開始，依行進行計算。 科列斯基 克勞特演演算法從矩陣 L 的左上角開始，依列進行計算。 若有需要，整個矩陣可以逐個元素計算得出，無論使用何種順序讀取。 計算的穩定性 假設我們要求解一個良置的線性方程組。採用了 LU 分解的演算法，除非進行某種繞軸旋轉，否則是不穩定的；如果演算法進行了繞軸旋轉，則其誤差取決於矩陣的增長因子，這個數通常（但非總是）很小。 現在，假設演算法適用科列斯基分解。如上所述，演算法的效率將會是原來的兩倍。此外，無必要進行繞軸旋轉且誤差總是很小。具體而言，若要求解 mathbf Ax mathbf b，mathbf y 表示已計算出的解，然後能解出幹擾方程組 mathbf Amathbf Emathbf ymathbf b，其中 mathbf E_2 le c_n varepsilon mathbf A_2 在這裡，quad_2 是指矩陣 2 範數，而 c_n 是一個取決於 n 的小常數，varepsilon 表示。 值得一提的是，科列斯基分解與平方根的使用有關。如果被分解的矩陣是正定的，那麼只要運算精確，矩陣中帶有平方根的元素的平方根下的數字永遠是正數。不幸的是，由於存在捨入誤差，這些數字可能為負數，並使演算法擱淺。然而，此種情況僅當矩陣為病態時才會出現。一種可解決此問題的方法，是增添一個對角修正矩陣至待分解矩陣，以增加矩陣的正定性。 此法雖或將減少分解的準確性，但有在某些情況卻頗有作為；譬如，執行應用於最最佳化的牛頓法時，若初期值距最優值較遠，則此時引入對角矩陣可以提高演演算法的穩定性。 LDL 分解 科列斯基分解的另一種形式 LDL 分解的計算方式如下所示， begin align mathbf ALDLmathrm T begin pmatrix 1 0 0 L_21 1 0 L_31 L_32 1 end pmatrix begin pmatrix D_1 0 0 0 D_2 0 0 0 D_3 end pmatrix begin pmatrix 1 L_21 L_31 0 1 L_32 0 0 1 end pmatrix begin pmatrix D_1 mathrm symmetric L_21 D_1 L_212D_1 D_2 L_31 D_1 L_31 L_21 D_1L_32 D_2 L_312D_1 L_322D_2D_3 end pmatrix end align 如果 是實數矩陣，下述之遞迴計算式適用於矩陣 及 中的所有元素 D_j A_jj sum_k1j1 L_jk2 D_k L_ij frac 1D_j left A_ij sum_k1j1 L_ik L_jk D_k right qquadtext for ij 如果 是複埃爾米特矩陣，則矩陣 及 的計算適用以下公式： D_j A_jj sum_k1j1 L_jk L_jk D_k L_ij frac 1D_j left A_ij sum_k1j1 L_ik L_jk D_k right qquadtext for ij 同樣地，若有需求，該讀取順序可以逐一計算矩陣中的每一個元素。 分塊矩陣變形 當 mathbf A 是一個不定矩陣時，LDL 分解在未經過謹慎的繞軸旋轉的情況下是不穩定的； 特別是，分解出的矩陣的元素可能是任意的。一個可取的改進手段是執行矩陣分塊後再執行分解，通常將原矩陣分為包含 2times2 的小矩陣的分塊矩陣： begin align mathbf ALDLmathrm T begin pmatrix mathbf I 0 0 mathbf L_21 mathbf I 0 mathbf L_31 mathbf L_32 mathbf I end pmatrix begin pmatrix mathbf D_1 0 0 0 mathbf D_2 0 0 0 mathbf D_3 end pmatrix begin pmatrix mathbf I mathbf L_21mathrm T mathbf L_31mathrm T 0 mathbf I mathbf L_32mathrm T 0 0 mathbf I end pmatrix begin pmatrix mathbf D_1 mathrm symmetric mathbf L_21 mathbf D_1 mathbf L_21 mathbf D_1 mathbf L_21mathrm T mathbf D_2 mathbf L_31 mathbf D_1 mathbf L_31 mathbf D_1 mathbf L_21mathrm T mathbf L_32 mathbf D_2 mathbf L_31 mathbf D_1 mathbf L_31mathrm T mathbf L_32 mathbf D_2 mathbf L_32mathrm T mathbf D_3 end pmatrix end align 在此，矩陣中每一個元素都是一個子矩陣。故此，可依照上述遞迴公式類比計算： mathbf D_j mathbf A_jj sum_k1j1 mathbf L_jk mathbf D_k mathbf L_jkmathrm T mathbf L_ij left mathbf A_ij sum_k1j1 mathbf L_ik mathbf D_k mathbf L_jkmathrm Tright mathbf D_j1 上述計算涉及矩陣相乘同精確的求逆，故而實踐中不能使用過大的分塊矩陣。 修正分解 在實踐中經常有修正科列斯基分解的需求。即，經已計算一些矩陣 mathbf A 的科列斯基分解 mathbf Amathbf LL，然後在 mathbf A 上稍作修改而產生的矩陣 tilde mathbf A ，欲對其進行一個修正的科列斯基分解 tilde mathbf A tilde mathbf L tilde mathbf L 。問題是，能否用已知的 mathbf A 的分解去修正 tilde mathbf A 的分解。 秩為 1 的修正（相加） 如果修正矩陣 tilde mathbf Amathbf Amathbf xx，則其修正的分解被稱為秩為 1 的修正（相加）。。 以下是一個 MATLAB 語言寫的實現秩為 1 的修正的小程式： function L cholupdate Lx n length x for k1n r sqrt L kk2 x k2 c r L k k s x k L k k L k k r L k1nk L k1nk sx k1n c x k1n cx k1n sL k1nk end end 秩為 1 的修正（相減） 如果 tilde mathbf A mathbf A mathbf x mathbf x ，那麼只有當 tilde mathbf A 仍然是正定的時候該方法才適用。 此條件下，上面的程式碼也可用於相減的情況，只需要將 r 和 L k1nk 的賦值式的加號替換成減號。 證明半正定矩陣的科列斯基分解唯一 上面的演演算法表明，每一個正定矩陣 A 都有一個科列斯基分解。此結論可以加入一些限制條件後，推廣到半正定的情況。但該條件並未被完全建立，例如，它未給出明確的數值演演算法以計算科列斯基因子。 如果 A 是一個 ntimes n 的半正定矩陣，則序列 mathbf Amathbf A1kmathbf I_n 是一個由正定矩陣構成的序列。而且，在運算元範數中 mathbf A_krightarrowmathbf A 在正定的情形下，每一個 mathbf A_k 都有其科列斯基分解 mathbf A_k mathbf L_kmathbf L_k。根據運算元範數的性質， mathbf L_k 2 le mathbf L_k mathbf L_k mathbf A_k 因而 mathbf L_k 是運算元巴拿赫空間上的一個有界集，因此是（因為基礎向量空間是有限維的）。因此，它有一個帶有限制 mathbf L 收斂子序列，也記作 mathbf L_k。容易驗證，矩陣 mathbf L 具有所需的特性，例如，滿足 mathbf A mathbf LL 以及 mathbf L 是下三角矩陣且其對角元素非負。對於所有的 x 和 y 都有， langle mathbf A x y rangle langle lim mathbf A_k x y rangle langle lim mathbf L_k mathbf L_k x y rangle langle mathbf L mathbf Lx y rangle 因此，mathbf Amathbf LL。因為基礎向量空間是有限維的，所以運算元空間的所有拓撲結構都是等價的。故此，範數上 mathbf L_k 收斂於 mathbf L，意味著，mathbf L_k 的每個元素都獨立地收斂於 mathbf L。此同時暗示，由於每個 mathbf L_k 都是對角元素非負的下三角矩陣，mathbf L 亦如此。 推廣 科列斯基分解可以推廣到元素中包含運算元的矩陣（稱為運算元矩陣）。令 mathcal H_n 是希爾伯特空間上的一個序列。考慮如下運算元矩陣 mathbf A begin bmatrix mathbf A_11 mathbf A_12 mathbf A_13 mathbf A_12 mathbf A_22 mathbf A_23 mathbf A _13 mathbf A_23 mathbf A_33 ddots end bmatrix 滿足直和 mathcal H oplus _n mathcal H_n 其中每一個 mathbf A_ij mathcal H_j rightarrow mathcal H _i 都是一個有界運算元。如果 mathbf A 是正定或半正定的，即對於有限的 k 及任意的 h in oplus _n 1k mathcal H_k 都有 langle hmathbf A hranglege0，則存在一個下三角的運算元矩陣 mathbf L 使得 mathbf A mathbf LL。此外也可以把 mathbf L 的對角元素化為正數。 用程式語言實現 C 語言GNU 科學庫提供了幾個科列斯基分解的實現。 Maxima 電腦代數系統函式 Cholesky 可用於計算科列斯基分解。 GNU Octave 數值計算系統提供了一些函式以計算，修正和應用科列斯基分解。 LAPACK 庫提供了一個高效能的科列斯基分解的實現，可以以 Fortran，C 語言及其他大多數語言讀取。 在 Python 中，numpylinalg 模組中的命令 Cholesky 可執行科列斯基分解。 在 Matlab 中，chol 命令可以簡單地對一個矩陣進行科列斯基分解。 在 R 語言中，chol 函式可進行科列斯基分解。 在 Wolfram Mathematica 中，函式 CholeskyDecomposition 可以對一個矩陣執行科列斯基分解。 在 C 中，中的命令 chol 可執行科列斯基分解。特徵庫提供了稀疏矩陣和稠密矩陣的科列斯基分解。 在中，函式 Decompose 提供科列斯基分解。 Apache Commons 數學庫中有科列斯基分解的實現，可應用於 Java、Scala 及任何其他 JVM 語言。 參見 矩陣分解 西爾維斯特慣性定理 矩陣的平方根 腳註 參考文獻 S J Julier and J K Uhlmann A General Method for Approximating Nonlinear Transformations of ProbabilityDistributions S J Julier and JK Uhlmann A new extension of the Kalman filter to nonlinear systems in Proc AeroSense 11th Int Symp AerospaceDefence Sensing Simulation and Controls 1997 pp 182193 外部連結 科學史 Sur la résolution numérique des systèmes déquations linéaires Choleskys 1910 manuscript online and analyzed on BibNum （法文） （英文） for English click A télécharger 資訊 Cholesky Decomposition The Data Analysis BriefBook Cholesky Decomposition on wwwmathlinuxcom Cholesky Decomposition Made Simple on Science Meanderthal 電腦程式碼 LAPACK，一個求解稠密線性代數問題的 FORTRAN 子程式的集合 ALGLIB，包含部分從 LAPACK 到 C、C、Delphi、Visual Basic 等的埠 libflame，帶有 LAPACK 功能的 C 函式庫 德克薩斯大學奧斯汀分校，有關科列斯基分解高效能實現的筆記及影片 Google，Library Ceres Solver MATLAB 程式，LDL 分解 Armadillo，一個 C 線性函式包 package 模擬中矩陣的利用 生成相關的隨機變數，Martin Haugh，哥倫比亞大學 線上計算機 線上矩陣運算，可執行科列斯基分解。 Category 矩陣分解 Category 數值線性代數 Category 運算元理論