矩陣的lu分解目的是將乙個非奇異矩陣\(a\)分解成\(a=lu\)的形式,其中\(l\)是乙個主對角線為\(1\)的下三角矩陣;\(u\)是乙個上三角矩陣。
比如\(a= \begin
1 & 2 & 4 \\
3 & 7 & 2 \\
2 & 3 & 3 \\
\end\),我們最終要分解成如下形式:
\[a=l\cdot u =
\begin
1 & 0 & 0 \\
3 & 1 & 0 \\
2 & -1 & 1 \\
\end
\cdot
\begin
1 & 2 & 4 \\
0 & 1 & -10 \\
0 & 0 & -15 \\
\end
\]現在主要的問題是如何由矩陣\(a\)計算得到矩陣\(l\)和\(u\)呢?我們將在下面詳細討論。
首先從矩陣\(u\)入手,因為它是乙個上三角矩陣,所以很容易想到高斯消元法,依次把矩陣\(a\)主對角線左下角的元素消為\(0\)就得到\(u\)了。
然後計算矩陣\(l\),這裡有個技巧,可以這樣想,正是因為有了\(l\),所以\(u\)的左下部分才能被消為\(0\),所以我們記錄一下把\(u\)的左下部分消為\(0\)時矩陣\(a\)每行所乘的倍數,這個減去的倍數便是\(l\)左下元素的值!
\[a=\begin
1 & 2 & 4 \\
3 & 7 & 2 \\
2 & 3 & 3 \\
\end
\overset \times (1)}}
\begin
1 & 2 & 4 \\
0 & 1 & -10 \\
2 & 3 & 3 \\
\end
\overset \times (1)}}
\begin
1 & 2 & 4 \\
0 & 1 & -10 \\
0 & -1 & -5 \\
\end
\overset \times (2)}}
\begin
1 & 2 & 4 \\
0 & 1 & -10 \\
0 & 0 & -15 \\
\end
=u\]
在運算過程中左下相應元素減去的倍數(上面紅色的數字)便是矩陣\(l\)左下角的元素,可以得到:
\[l=
\begin
1 & 0 & 0 \\
\color & 1 & 0 \\
\color & \color & 1 \\
\end\]
\[for \text i = 1 : n \hspace \\
for \text j = i : n \quad此時i為行下標,j為列下標\\
\qquad u_=a_-\sum_^ l_u_ \hspace\\
\qquad for \text x = i+1 : n \quad 此時x為行下標,i為列下標\\
\qquad l_=(a_-\sum_^ l_u_) /u_ \hspace\\
\]其中\(n\)為方陣的行或列長度,可以看出先計算矩陣\(u\)的第一行,再計算矩陣\(l\)的第一列,再計算矩陣\(u\)的第二行,再計算矩陣\(l\)的第二列,依此類推。
clc,clear all,close all
% 矩陣的lu分解
%% 自己實現
a = [1 2 4;3 7 2;2 3 3]
[n,n] = size(a);
l = eye(n,n); % l初始化為單位矩陣
u = zeros(n,n); % u初始化為零矩陣
for i = 1 : n % 根據計算公式實現
for j = i : n
u(i,j) = a(i,j) - sum(l(i,1 : i - 1) .* u(1 : i - 1,j)');
endfor x = i + 1 : n
l(x,i) = (a(x,i) - sum(l(x,1 : i - 1) .* u(1 : i - 1,i)')) ./ u(i,i);
endendl
u%% 內建函式實現
[l1,u1] = lu(a)
#include #include using namespace std;
int main()
,, };
int n = a.size();
vector> u(n, vector(n));
vector> l(n, vector(n));
for (int i = 0; i < n; i++) //初始化矩陣l和矩陣u
for (int j = 0; j < n; j++)
for (int i = 0; i < n; i++)
for (int x = i + 1; x < n; x++)
}cout << "a:" << endl; //輸出矩陣a
for (int i = 0; i < n; i++)
cout << endl;
} cout << "l:" << endl; //輸出矩陣l
for (int i = 0; i < n; i++)
cout << endl;
} cout << "u:" << endl; //輸出矩陣u
for (int i = 0; i < n; i++)
cout << endl;
} return 0;
}
矩陣sum 矩陣LU分解的MATLAB與C 實現
矩陣的lu分解目的是將乙個非奇異矩陣 比如 現在主要的問題是如何由矩陣 計算得到矩陣 和 呢?我們將在下面詳細討論。首先從矩陣 入手,因為它是乙個上三角矩陣,所以很容易想到高斯消元法,依次把矩陣 主對角線左下角的元素消為 就得到 了。然後計算矩陣 這裡有個技巧,可以這樣想,正是因為有了 所以 的左下...
c 矩陣求逆的lu分解實現
c 矩陣求逆的lu分解實現 初學c 嘗試利用基礎知識編寫矩陣求逆。但發現求解伴隨陣的過程非常複雜且難以實現,而我正好看到一篇求三角陣伴隨矩陣的文章,故嘗試程式設計實現。在這種方法下,計算量明顯減小,實現方法,思路適合初學者。參考文獻 三角形矩陣求伴隨矩陣的一種方法 曾月新 求逆矩陣思路 1.求矩陣的...
矩陣QR分解的MATLAB與C 實現
矩陣的qr分解目的是將乙個列滿秩矩陣 a 分解成 a qr 的形式,我們這裡暫時討論 a 為方陣的情況。其中 q 為正交矩陣 r 為正線 主對角線元素為正 上三角矩陣,且分解是唯一的。比如 a begin 1 2 2 2 1 2 1 2 1 end 我們最終要分解成如下形式 a q cdot r b...