【发布时间】:2016-02-11 22:12:51
【问题描述】:
我正在尝试创建一个程序,该程序将一个方形(n×n)矩阵作为输入,如果它是可逆的,LU 将使用高斯消元法分解矩阵。
这是我的问题:在课堂上,我们了解到最好更改行,以便您的枢轴始终是其列中的最大数字(绝对值)。例如,如果矩阵是A = [1,2;3,4],那么切换行是[3,4;1,2],然后我们可以继续进行高斯消元。
我的代码适用于不需要行更改的矩阵,但对于需要更改行的矩阵,则不需要。这是我的代码:
function newgauss(A)
[rows,columns]=size(A);
P=eye(rows,columns); %P is permutation matrix
if(det(A)==0) %% determinante is 0 means no single solution
disp('No solutions or infinite number of solutions')
return;
end
U=A;
L=eye(rows,columns);
pivot=1;
while(pivot<rows)
max=abs(U(pivot,pivot));
maxi=0;%%find maximum abs value in column pivot
for i=pivot+1:rows
if(abs(U(i,pivot))>max)
max=abs(U(i,pivot));
maxi=i;
end
end %%if needed then switch
if(maxi~=0)
temp=U(pivot,:);
U(pivot,:)=U(maxi,:);
U(maxi,:)=temp;
temp=P(pivot,:);
P(pivot,:)=P(maxi,:);
P(maxi,:)=temp;
end %%Grade the column pivot using gauss elimination
for i=pivot+1:rows
num=U(i,pivot)/U(pivot,pivot);
U(i,:)=U(i,:)-num*U(pivot,:);
L(i,pivot)=num;
end
pivot=pivot+1;
end
disp('PA is:');
disp(P*A);
disp('LU is:');
disp(L*U);
end
澄清:由于我们正在切换行,我们希望分解P(置换矩阵)乘以A,而不是我们作为输入的原始A。
代码说明:
- 首先我检查矩阵是否可逆,如果不是,停止。如果是,则枢轴为 (1,1)
- 我在第 1 列中找到最大的数字,并切换行
- 使用高斯消元法对第 1 列进行评分,将除点 (1,1) 以外的所有部分都归零
- 枢轴现在是 (2,2),在第 2 列中找到最大的数字...冲洗,重复
【问题讨论】:
-
类似地,使用阈值代替比较
maxi~=0。还要避免使用也是内置函数名称的变量名(max),这只会让人困惑
标签: algorithm matlab linear-algebra matrix-decomposition