关于matlab中的max函数
完成工程数值方法的作业时,有一个PA=LU分解的题目,中间有一段进行比较的代码,但是在进行第二次调换的时候却无法调换过来,百思不得其解。
function [P,L,U]=PLU_decomposition(A)
num=length(A);
U=A;
L=diag(ones(num,1));
P=diag(ones(num,1));
%第一次判断
%消元
for j=1:num-1
[maxnum,index]=max(U(j:1:num,j));
if (maxnum~=abs(U(j,j)))
U ([j,index],:)=U([index,j],:);
P([j,index],:)=P([index,j],:);
end
for i=j+1:num
L(i,j)=U(i,j)/U(j,j);
U(i,:)=U(i,:)-U(i,j)/U(j,j)*U(j,:);
end
end
end
后面研究发现了一个很好玩的地方,主要也是自己没注意过。max函数的index表示的是在这一个行向量或者列向量的第几个位置。打个比方,当我矩阵跑到第二行时,比方说下面的这个矩阵。那么这时候应该进行调换,index存储的是调换的行数。本来应该是3的(我代码中取得是这一行但是去掉上半部分),最终index输出的是2,因为对于[1;2]这个向量,他就是位于第二个位置。写代码的时候这一点着实有点坑人。
加一行就可以了,下面是完整代码:
function [P,L,U]=PLU_decomposition(A)
num=length(A);
U=A;
L=diag(ones(num,1));
P=diag(ones(num,1));
%第一次判断
%消元
for j=1:num-1
[maxnum,index]=max(U(j:1:num,j));%max中的index只是向量中的第几个,并非返回数量
index=index+j-1;
if (maxnum~=abs(U(j,j)))
U ([j,index],:)=U([index,j],:);
P([j,index],:)=P([index,j],:);
end
for i=j+1:num
L(i,j)=U(i,j)/U(j,j);
U(i,:)=U(i,:)-U(i,j)/U(j,j)*U(j,:);
end
end
end