LU分解版本2_选主元、非原地存储
function ex2_7_2
%对系数矩阵A进行LU分解【自己写的版本,没有采用原地存储方式,进行选主元】
%将L矩阵和U矩阵输出,
A = [10 -7 0;
-3 2 6;
5 -1 5];
%对系数矩阵A进行LU分解,最终得到L 和 U矩阵
%初始化L和U矩阵.
L = [0 0 0;
0 0 0;
0 0 0]
U = [0 0 0;
0 0 0;
0 0 0]
[n,n] = size(A);
for k = 1:1:n
%%
% 在计算乘子之前,进行选主元
[m,q] = max(abs(A(k:n,k)));
% q返回的是一个行号,q的值是一个相对的值,当k=1时,q的值是相对k-1,而言的,
% 当k等于2的时候,q的值是相对于k-1而言的。
q = q + k - 1;
% 选主元
if(k ~= q)
% 当k!=q之后,说明主元所在列的最大值不是当前行,需要进行行交换,
% A(k,:) = A(q,:);===>这样写行交换的代码居然不对!不是有种方法不需要,中间变量吗!
B = A(k,:);
A(k,:) = A(q,:);
A(q,:) = B;
end
%%
i = k+1:n;
%计算乘子,将乘子填入到L矩阵的第(2、3)行,第1列
L(i,k) = A(i,k)/A(k,k);
%更新系数矩阵A,就是将A的第一行乘以相应的乘子的相反数,加到第二行和第三行
j = k:n;
A(i,j) = A(i,j) - L(i,k)*A(k,j);
end
U = A;
L
U