matlab练习程序(Schur补)

Schur 补是一种矩阵分解方法,通过将一个大的矩阵分解为几个较小的矩阵来简化计算,通常能够提高矩阵求逆的速度。

对于形如下面的矩阵:

可以把矩阵划分为左上、右上、左下、右下四个分块矩阵。

得到矩阵:

根据A和D的奇异性,可以分两种情况。

如果A可逆,则有:

如果D可逆,则有:

公式两边同时求逆,得到下面两组公式:

如果A可逆,则有:

如果D可逆,则有:

根据上述公式,就能求出原始矩阵的逆。

下面的矩阵就是之前介绍BA中的H矩阵,当时直接inv求逆了,这里用Schur补求逆。

matlab代码如下:

clear all;close all;clc;

load H.mat
spy(H);

n = length(H);
m = 12;

A = H(1:m,1:m);
B = H(1:m,m+1:end);
C = H(m+1:end,1:m);
D = H(m+1:end,m+1:end);

if det(A)~=0
    A_inv = inv(A);
    U = [eye(m) -A_inv*B;zeros(n-m,m) eye(n-m)];
    V = [A_inv zeros(m,n-m);zeros(n-m,m) inv(D-C*A_inv*B)];
    W = [eye(m) zeros(m,n-m);-C*A_inv eye(n-m)];
    H_inv= U*V*W;
else
    D_inv = inv(D);
    U = [eye(m) zeros(m,n-m);-D_inv*C eye(n-m)];
    V = [inv(A-B*D_inv*C) zeros(m,n-m);zeros(n-m,m) inv(D)];
    W = [eye(m) -B*D_inv; zeros(n-m,m) eye(n-m)];
    H_inv= U*V*W;
end

dif = inv(H) - H_inv;
sum(dif(:))

 H.mat这里下载

posted @ 2024-02-16 15:19  Dsp Tian  阅读(145)  评论(0编辑  收藏  举报