记录学习过程,多多交流~
关于矩阵求逆的更新问题:对于一个非奇异矩阵A,如果用某一列向量b替换其第p列,那么如何在A逆的基础上更新出新矩阵的逆呢?
在这里我们使用updateinv函数。
首先创建updateinv函数:我们在Matlab中新建一个脚本,存储创建的函数。注意不能直接在matlab界面创建,会报错。
function invA=updateinv(invA,p,b)
%此函数用来计算矩阵A中p列被b列代替后,A的逆的更新
[n,n]=size(invA);
d=invA*b;
if abs(d(p))<eps %若d(p)=0,则矩阵是奇异的,即(A的逆*A的更新)的行列式为0
warning('替换后的矩阵是奇异的!');
newinvA=[];
return;
else
invA(p,:)=invA(p,:)/d(p); %替换后,对A的逆的p行进行行变换,此时(A的逆*A的更新)的p行除以d(p),将d(p)变为1
if p>1
for i=1:p-1
invA(i,:)=invA(i,:)-d(i)*invA(p,:); %对A的逆的1:(p-1)行进行相应行变换,此时(A的逆*A的更新)的1:(p-1)的d(p)变为0
end
end
if p<n
for i=p+1:n
invA(i,:)=invA(i,:)-d(i)*invA(p,:); %对A的逆的(p+1):n行进行行变换,此时(A的逆*A的更新)的p+1:n的d(p)变为0
end
end
end
调用updateinv函数:
已知矩阵A=[1,2,3,4;5,6,1,0;0,1,1,0;1,1,2,3],b=[1;0;1;0],求矩阵A的第2列被b替换后的逆矩阵。
>> A=[1,2,3,4;5,6,1,0;0,1,1,0;1,1,2,3];
>> b=[1;0;1;0];
>> invA=inv(A)
invA =
-1.5000 0.1000 0.4000 2.0000
1.5000 0.1000 -0.6000 -2.0000
-1.5000 -0.1000 1.6000 2.0000
1.0000 0 -1.0000 -1.0000
>> newinvA=updateinv(invA,2,b)
newinvA =
0.3333 0.2222 -0.3333 -0.4444
1.6667 0.1111 -0.6667 -2.2222
-1.6667 -0.1111 1.6667 2.2222
1.0000 0 -1.0000 -1.0000
>> A(:,2)=b %验证,将A的第2列替换为b
A =
1 1 3 4
5 0 1 0
0 1 1 0
1 0 2 3
>> inv(A) %求新矩阵的逆,结果与公式一致
ans =
0.3333 0.2222 -0.3333 -0.4444
1.6667 0.1111 -0.6667 -2.2222
-1.6667 -0.1111 1.6667 2.2222
1.0000 -0.0000 -1.0000 -1.0000