📄 invmat.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 用四种方法求矩阵的逆 %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function InvMat(A)
if(0 == det(A))
error('可逆矩阵的特征值必须非零!')
end
[m,n] = size(A);
if(m ~= n)
error('可逆矩阵必须为方阵!')
end
%%% 第一种方法:伴随矩阵法
tic
inv_A = zeros(size(A));
detA = det(A);
for i = 1:n
for j = 1:n
temp_Matrix = A;
temp_Matrix(i,:) = [];
temp_Matrix(:,j) = [];
inv_A(j,i) = (-1)^(i+j)*det(temp_Matrix)/detA;
end
end
inv_A1 = inv_A;
time1 = toc;
%%% 第二种方法:初等变换法
tic
B = [A,eye(n)];
B(1,:) = sum(B);
B(1,:) = B(1,:)/B(1,1);
for i = 1:n-1 %第i列
for j = i+1:n %第j行
B(j,:) = B(j,:) - B(j,i)*B(i,:);
end
B(i+1,:) = B(i+1,:)/B(i+1,i+1);
end
B(n,:) = B(n,:)/B(n,n); %至此已将矩阵的前半部分上三角化,且对角线上元素都为1
%下面将已得到的前半部分单位化为 I(n)
for i = n-1:-1:1
for j = i+1:n
B(i,:) = B(i,:) - B(i,j)*B(j,:);
end
end
inv_A2 = B(:,n+1:2*n);
time2 = toc;
%%% 第三种方法:奇异值分解法
tic
[U,S,V] = svd(A);
for i = 1:n
if S(i,i) ~= 0
S(i,i) = 1/S(i,i);
end
end
inv_A3 = V*S*U';
time3 = toc;
%%% 第四种方法:Greville方法
tic
inv_A4 = A(:,1)'/(norm(A(:,1)))^2;
for k = 2:n
dk = inv_A4*A(:,k);
ck = A(:,k) - A(:,1:k-1)*dk;
if(norm(ck) == 0) %c(k)=0
bk = (dk'*inv_A4)'/(1+dk'*dk);
else
bk = (ck'/norm(ck)^2)';
end
inv_A4 = [(inv_A4 - dk*bk')',bk]';
end
time4 = toc;
disp('通过第一种方法--伴随矩阵法得到的逆矩阵为:')
inv_A1;
sprintf('The First Method Elapsed time is %fs',time1)
disp('通过第二种方法--初等变换法得到的逆矩阵为:')
inv_A2;
sprintf('The Second Method Elapsed time is %fs',time2)
disp('通过第三种方法--奇异值分解法得到的逆矩阵为:')
inv_A3;
sprintf('The Third Method Elapsed time is %f s',time3)
disp('通过第四种方法--Greville法得到的逆矩阵为:')
inv_A4;
sprintf('The Forth Method Elapsed time is %f s',time4)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -