矩陣LU分解的MATLAB與C 實現

2022-03-03 22:02:18 字數 2797 閱讀 4841

矩陣的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...