1、伪代码
2、Matlab实现
%% Matlab 2018b——用高斯消去法进行矩阵的LU分解:A=LU
A=[1,2,2;4,4,2;4,6,4];
[m,n]=size(A);
M=zeros(m,n);
for i=1:(n-1)
if A(i,i)==0
break;
end
for j=(i+1):m
M(j,i)=A(j,i)/A(i,i);
end
for k=i:n
for j=(i+1):m
A(j,k)=A(j,k)-M(j,i)*A(i,k);
end
end
end
L=eye(m,n)+M*eye(m,n)';
U=A;
3、OpenCV实现
// OpenCV 4.5.0——用高斯消去法进行矩阵的LU分解:A=LU
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat A = (Mat_<float>(3, 3) << 1, 2, 2, 4, 4, 2, 4, 6, 4);
Mat M = Mat::zeros(3, 3, CV_32FC1);
Mat I = Mat::eye(3, 3, CV_32FC1);
Size n = A.size();
for (int i = 0; i < n.width - 1; i++)
{
if (A.at<float>(i, i) == 0)
break;
for (int j = i + 1; j < n.height; j++)
M.at<float>(j, i) = A.at<float>(j, i) / A.at<float>(i, i);
for (int j = i; j < n.width; j++)
{
for (int k = i + 1; k < n.height; k++)
A.at<float>(k, j) = A.at<float>(k, j) - M.at<float>(k, i)*A.at<float>(i, j);
}
}
Mat L = I + M * I.t();
Mat U = A;
cout << "L = " << L << endl;
cout << "U = " << U << endl;
getchar();
return 0;
}
参考文献:《科学计算导论》(第2版)——Michael T. Health 著 张威等 译