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這裏下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章