矩陣的lu分解目的是將乙個非奇異矩陣
比如 現在主要的問題是如何由矩陣
計算得到矩陣
和 呢?我們將在下面詳細討論。
首先從矩陣
入手,因為它是乙個上三角矩陣,所以很容易想到高斯消元法,依次把矩陣
主對角線左下角的元素消為
就得到
了。然後計算矩陣
,這裡有個技巧,可以這樣想,正是因為有了
,所以
的左下部分才能被消為
,所以我們記錄一下把
的左下部分消為
時矩陣
每行所乘的倍數,這個減去的倍數便是
左下元素的值!
在運算過程中左下相應元素減去的倍數(上面紅色的數字)便是矩陣$l$左下角的元素,可以得到:
其中n為方陣的行或列長度,可以看出先計算矩陣
的第一行,再計算矩陣
的第一列,再計算矩陣
的第二行,再計算矩陣
的第二列,依此類推。
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;
}
c 矩陣求逆的lu分解實現
c 矩陣求逆的lu分解實現 初學c 嘗試利用基礎知識編寫矩陣求逆。但發現求解伴隨陣的過程非常複雜且難以實現,而我正好看到一篇求三角陣伴隨矩陣的文章,故嘗試程式設計實現。在這種方法下,計算量明顯減小,實現方法,思路適合初學者。參考文獻 三角形矩陣求伴隨矩陣的一種方法 曾月新 求逆矩陣思路 1.求矩陣的...
矩陣LU分解的MATLAB與C 實現
矩陣的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 e...
MIT線性代數 4 矩陣A的LU分解
乘以逆矩陣得到單位陣需要反著乘。第二行是第一行兩邊同時轉置的結果,得到的結論是a轉置的逆是a的逆的轉置。l是lower也就是下三角矩陣,u是upper也就是上三角矩陣。先是由e初等矩陣消元從a變化到u。l與e是什麼關係呢?答案是互為逆矩陣。2.2a ldu 有時候我們也可以把主元單獨分離出來,得到d...