📄 几种常用求逆的matlab程序.txt
字号:
% Examples: a = [2 0 0;1 1 2;1 -1 3];
% Inv_matrix(A)
function [X,time] = Inv_matrix(A)
%%%%%%%%%%%%%%%%% 奇异值分解法求矩阵的逆 %%%%%%%%%%%%%%%%
tic;
[u,d,v] = svd(A); % 求A的奇异值分解
% 将矩阵d对角线上的非零元素变为其倒数
r = diag(d);
n = length(r);
i = 1;
while( i<=n && r(i) ~= 0 )
r(i) = 1/r(i);
i=i+1;
end
d = diag(r);
X1 = v*d*u';
time1 = toc;
disp('奇异值分解法求逆结果与耗时:');
disp(' 逆矩阵为:')
disp(X1);
disp(' 耗时:');
disp(time1);
%%%%%%%%%%%%%%%%%% Greville方法求矩阵的逆 %%%%%%%%%%%%%%%%%
tic;
X2=A(:,1)'/( A(:,1)'*A(:,1) );
for i=2:n
di=X2*A(:,i);
ci=A(:,i)-A(:,1:(i-1))*di;
if ci'*ci==0
bi=(di'*X2/(1+di'*di))';
else
bi=(ci'/(ci'*ci))';
end
X2=[X2-di*bi';bi'];
end
time2 = toc;
disp('Greville方法求逆结果与耗时:');
disp(' 逆矩阵为:')
disp(X2);
disp(' 耗时:');
disp(time2);
if det(A)==0
error('矩阵行列式为0,不能用伴随矩阵法和高斯消去法求矩阵的逆!');
end
%%%%%%%%%%%%%%%%%% 伴随矩阵法求矩阵的逆 %%%%%%%%%%%%%%%%%
tic;
bs_A = zeros(n); % 初始化A的伴随矩阵
% 求A的伴随矩阵
for i = 1:n
for j = 1:n
bs_A(i,j) = (-1)^(i+j)*det(A([1:j-1 j+1:n],[1:i-1 i+1:n]));
end
end
X3 = bs_A/(det(A));
time3 = toc;
disp('伴随矩阵法求逆结果与耗时:');
disp(' 逆矩阵为:')
disp(X3);
disp(' 耗时:');
disp(time3);
%%%%%%%%%%%%%%%%%% 高斯消去法求矩阵的逆 %%%%%%%%%%%%%%%%%
tic;
B = [A eye(n)];
% 将A对角线以下的元素都化为0,对角线元素都化为1
for i=1:n
% 判断该行对角元素是否为零,为零就进行换行
j=i+1;
while(abs(B(i,i)) < 0.000001 && j<=n)
t=B(i,:);
B(i,:)=B(j,:);
B(j,:)=t;
j=j+1;
end
B(i,:)=B(i,:)/B(i,i);
for k=i+1:n
B(k,:)=B(k,:)-B(i,:)*B(k,i)/B(i,i);
end
end
% 将A对角线以上的元素都化为0
for i=n:-1:1
for k=i-1:-1:1
B(k,:)=B(k,:)-B(k,i)*B(i,:);
end
end
X4 = B(:,[n+1:n+n]);
time4 = toc;
disp('高斯消去法求逆结果与耗时:');
disp(' 逆矩阵为:')
disp(X4);
disp(' 耗时:');
disp(time4);
if nargout==1
X=[X1,X2,X3,X4];
end
if nargout==2
X=[X1,X2,X3,X4];
time = [time1,time2,time3,time4];
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -