運用Householder矩陣證明

時間 2021-09-06 11:59:46

1樓:電燈劍客

這個問題一般來講是用特徵值或者sherman-morrison公式來做的,如果你一定需要householder矩陣,那麼這樣做:

取householder陣h使得hx//e1,即hx=ke1,其中e1是單位陣的第一列。那麼

det(i+xy')=det(h(i+xy')h)=det(i+ke1*y'h),

如果記z=hy,注意到ke1*z'是非零元只在第一行出現的矩陣,所以i+ke1*z'是上三角陣,det(i+ke1*y'h)=1+k*z(1),其中z(1)是z的第1個分量,利用z(1)=e1'z即得結論。

2樓:匿名使用者

首先考察矩陣a=x*y^t

r(a)<=r(x)=1

這個矩陣的n個特徵值中,必定是n-1個0,和一個。

如果x,y的內積為0,即=0,則a的特徵值為全0,如果x,y的內積不為0,即不等於0,則a的特徵值為(n-1)個0和一個非零數

不管是哪種情況,a的特徵值都能記為:0,0,...,0,所以i+a的特徵值是:

1,1,...,1,1+det(i+a)就是特徵值的乘積=1*1*...*1*(1+)=1+=1+(x^t*y)

證明 :每個n階正交矩陣都可以表示成一系householder矩陣的乘積 5

3樓:明哥歸來

要求是標準正交基下的矩陣

實正交矩陣按行列式可分為兩類

對於2階實正交陣,行列式為1的表示旋轉,行列式為-1的表示反射對於n階的正交陣(對應於高維歐氏空間的正交變換),狹義地講旋轉變換(也叫平面旋轉變換,或者givens變換)是有n-2個特徵值為1,餘下兩個特徵值在單位圓周上按λ,1/λ成對出現的正交變換

映象變換(也叫householder變換)是有n-1個特徵值為1,餘下一個特徵值為-1的正交變換

廣義一點可以把行列式為1的都認為是旋轉(因為是有限個平面旋轉的乘積),行列式為-1的認為是反射(不能表示成有限個平面旋轉的乘積,必須要再作用奇數次映象變換)

如何用householder變換求矩陣的qr分解 例子

4樓:匿名使用者

||[householder陣]

(1) 設a rn, = ||a||2,通常取 與a1同號,記h=i-2vvt,(v= ),

則ha= - e1. h=i -2vvt稱為householder陣。

(2) 更一般地,對a=(a1,a2,…am,am+1,…,an)t,記 = ,可求出h,使

ha=(a1,a2,…am, ,0,…,0)t。

為此,先在rn-m中求 使 滿足

=(am+1,…,an)t=(- ,0,…,0,0)t,

再作h= ,則ha= (a1,a2,…am,am+1,…,an)t =( a1,a2,…am,- ,0,…,0,0)t

[用householder方法求矩陣的qr分解]

記a=(aij)n*n,由1可知,存在h1=i -2v1v1t,使

h1(a11,a21,…,an1)t=(a11(1),0,…,0)t,

於是 h1a=

又由1知,存在h2= ,使 ,於是

h1a= =

類似地依次進行n-1次,得出

hn-1hn-2…h1a= 。

記r=hn-1hn-2…h1a,q=hnhn-1…h1,得a=q*r

如何用householder變換求hessenberg矩陣

5樓:q我

[householder陣]

(1) 設a rn, = ||a||2,通常取 與a1同號,記h=i-2vvt,(v= ),

則ha= - e1. h=i -2vvt稱為householder陣。

(2) 更一般地,對a=(a1,a2,…am,am+1,…,an)t,記 = ,可求出h,使

ha=(a1,a2,…am, ,0,…,0)t。

為此,先在rn-m中求 使 滿足

=(am+1,…,an)t=(- ,0,…,0,0)t,

再作h= ,則ha= (a1,a2,…am,am+1,…,an)t =( a1,a2,…am,- ,0,…,0,0)t

[用householder方法求矩陣的qr分解]

6樓:深圳華邦瀛

你描述的我根本不明白你在說什麼 你遇到什麼問題?想達到什麼功能?

用householder怎樣將實對稱矩陣轉化為三對角矩陣 例項

7樓:

//約化對稱矩陣為三對角對稱矩陣

//利用householder變換將n階實對稱矩陣約化為對稱三對角矩陣

//a-長度為n*n的陣列,存放n階實對稱矩陣

//n-矩陣的階數

//q-長度為n*n的陣列,返回時存放householder變換矩陣

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

void eastrq(double a,int n,double q,double b,double c);

//求實對稱三對角對稱矩陣的全部特徵值及特徵向量

//利用變型qr方法計算實對稱三對角矩陣全部特徵值及特徵向量

//n-矩陣的階數

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

//q-長度為n*n的陣列,若存放單位矩陣,則返回實對稱三對角矩陣的特徵向量組

// 若存放householder變換矩陣,則返回實對稱矩陣a的特徵向量組

//a-長度為n*n的陣列,存放n階實對稱矩陣

int ebstq(int n,double b,double c,double q,double eps,int l);

//約化實矩陣為赫申伯格(hessen berg)矩陣

//利用初等相似變換將n階實矩陣約化為上h矩陣

//a-長度為n*n的陣列,存放n階實矩陣,返回時存放上h矩陣

//n-矩陣的階數

void echbg(double a,int n);

//求赫申伯格(hessen berg)矩陣的全部特徵值

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//利用帶原點位移的雙重步qr方法求上h矩陣的全部特徵值

//a-長度為n*n的陣列,存放上h矩陣

//n-矩陣的階數

//u-長度為n的陣列,返回n個特徵值的實部

//v-長度為n的陣列,返回n個特徵值的虛部

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int edqr(double a,int n,double u,double v,double eps,int jt);

//求實對稱矩陣的特徵值及特徵向量的雅格比法

//利用雅格比(jacobi)方法求實對稱矩陣的全部特徵值及特徵向量

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的陣列,存放實對稱矩陣,返回時對角線存放n個特徵值

//n-矩陣的階數

//u-長度為n*n的陣列,返回特徵向量(按列儲存)

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int eejcb(double a,int n,double v,double eps,int jt);

選自《徐世良數值計算程式集(c)>>

每個程式都加上了適當地註釋,陸陸續續幹了幾個月才整理出來的啊。

今天都給貼出來了

#include "stdio.h"

#include "math.h"

//約化對稱矩陣為三對角對稱矩陣

//利用householder變換將n階實對稱矩陣約化為對稱三對角矩陣

//a-長度為n*n的陣列,存放n階實對稱矩陣

//n-矩陣的階數

//q-長度為n*n的陣列,返回時存放householder變換矩陣

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

void eastrq(double a,int n,double q,double b,double c) }

for (i=n-1; i>=1; i--) }

if (h+1.0==1.0)

b[i]=0.0;

} else

h=h-q[u]*c[i-1];

q[u]=q[u]-c[i-1];

f=0.0;

for (j=0; j<=i-1; j++)

if (j+1<=i-1) }

c[j-1]=g/h;

f=f+g*q[j*n+i];

} h2=f/(h+h);

for (j=0; j<=i-1; j++) }

b[i]=h;

} }b[0]=0.0;

for (i=0; i<=n-1; i++)

for (k=0; k<=i-1; k++) }

} u=i*n+i;

b[i]=q[u];

q[u]=1.0;

if (i-1>=0) }

} return;

//求實對稱三對角對稱矩陣的全部特徵值及特徵向量

//利用變型qr方法計算實對稱三對角矩陣全部特徵值及特徵向量

//n-矩陣的階數

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

//q-長度為n*n的陣列,若存放單位矩陣,則返回實對稱三對角矩陣的特徵向量組

// 若存放householder變換矩陣,則返回實對稱矩陣a的特徵向量組

//a-長度為n*n的陣列,存放n階實對稱矩陣

int ebstq(int n,double b,double c,double q,double eps,int l)

m=j;

while ((m<=n-1)(fabs(c[m])>d))

if (m!=j)

it=it+1;

g=b[j];

p=(b[j+1]-g)/(2.0*c[j]);

r=sqrt(p*p+1.0);

if (p>=0.0)

else

h=g-b[j];

for (i=j+1; i<=n-1; i++)

f=f+h;

p=b[m];

e=1.0;

s=0.0;

for (i=m-1; i>=j; i--)

else

p=e*b[i]-s*g;

b[i+1]=h+s*(e*g+s*b[i]);

for (k=0; k<=n-1; k++) }

c[j]=s*p;

b[j]=e*p;

} while (fabs(c[j])>d);

} b[j]=b[j]+f;

} for (i=0; i<=n-1; i++) }

if (k!=i) }

} return(1);

} //約化實矩陣為赫申伯格(hessen berg)矩陣

//利用初等相似變換將n階實矩陣約化為上h矩陣

//a-長度為n*n的陣列,存放n階實矩陣,返回時存放上h矩陣

//n-矩陣的階數

void echbg(double a,int n) }

if (fabs(d)+1.0!=1.0)

for (j=0; j<=n-1; j++) }

for (i=k+1; i<=n-1; i++)

for (j=0; j<=n-1; j++) }

} }return;

} //求赫申伯格(hessen berg)矩陣的全部特徵值

//利用帶原點位移的雙重步qr方法求上h矩陣的全部特徵值

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的陣列,存放上h矩陣

//n-矩陣的階數

//u-長度為n的陣列,返回n個特徵值的實部

//v-長度為n的陣列,返回n個特徵值的虛部

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int edqr(double a,int n,double u,double v,double eps,int jt)

ii=(m-1)*n+m-1;

jj=(m-1)*n+m-2;

kk=(m-2)*n+m-1;

ll=(m-2)*n+m-2;

if (l==m-1)

else if (l==m-2)

u[m-1]=(-b-xy*y)/2.0;

u[m-2]=c/u[m-1];

v[m-1]=0.0; v[m-2]=0.0;

} else

m=m-2;

it=0;

} else

it=it+1;

for (j=l+2; j<=m-1; j++)

for (j=l+3; j<=m-1; j++)

for (k=l; k<=m-2; k++) }

else

if ((fabs(p)+fabs(q)+fabs(r))!=0.0)

s=xy*sqrt(p*p+q*q+r*r);

if (k!=l)

e=-q/s;

f=-r/s;

x=-p/s;

y=-x-f*r/(p+s);

g=e*r/(p+s);

z=-x-e*q/(p+s);

for (j=k; j<=m-1; j++)

a[jj]=q;

a[ii]=p;

} j=k+3;

if (j>=m-1)

for (i=l; i<=j; i++)

a[jj]=q;

a[ii]=p;

} }} }} return(1);

} //求實對稱矩陣的特徵值及特徵向量的雅格比法

//利用雅格比(jacobi)方法求實對稱矩陣的全部特徵值及特徵向量

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的陣列,存放實對稱矩陣,返回時對角線存放n個特徵值

//n-矩陣的階數

//u-長度為n*n的陣列,返回特徵向量(按列儲存)

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int eejcb(double a,int n,double v,double eps,int jt) }

} while (1==1) }

} if (fmjt)

l=l+1;

u=p*n+q;

w=p*n+p;

t=q*n+p;

s=q*n+q;

x=-a[u];

y=(a[s]-a[w])/2.0;

omega=x/sqrt(x*x+y*y);

if (y<0.0)

sn=1.0+sqrt(1.0-omega*omega);

sn=omega/sqrt(2.0*sn);

cn=sqrt(1.0-sn*sn);

fm=a[w];

a[w]=fm*cn*cn+a[s]*sn*sn+a[u]*omega;

a[s]=fm*sn*sn+a[s]*cn*cn-a[u]*omega;

a[u]=0.0;

a[t]=0.0;

for (j=0; j<=n-1; j++) }

for (i=0; i<=n-1; i++) }

for (i=0; i<=n-1; i++) }

return(1);}

c語言矩陣轉置運用二維陣列和指標

形參int a n 和int a n 在編譯時都被解釋為 a是指向長度為n的一維陣列的指標 所以函式體內的操作可以二者完全一樣。就是說如果你這個函式是正確的的話,把第一個形參改為int a n 其餘不變就是完全正確的。所以這沒有什麼新的意義,這裡就不費筆墨了。至於改為形參int a,那得稍費周折,因...

矩陣乘3 2矩陣要怎麼算,2 3矩陣乘3 2矩陣要怎麼算?

墨汁諾 對於矩陣的乘法 記住a b與b c的矩陣相乘 得到的就是a c矩陣 而其中第m行n列的元素 就是a b的第m行,與b c的第n列元素 對應相乘之後加和即可 這裡的2 3矩陣與3 2矩陣相乘 就得到2 2矩陣 3 3矩陣與3 2矩陣乘法公式 愛佳佳的恐龍 3 3矩陣與3 2矩陣相乘結果 ab ...

什麼叫正交矩陣,什麼是正定矩陣,正交矩陣

兔老大米奇 正交矩陣是方塊矩陣,行向量和列向量皆為正交的單位向量。行向量皆為正交的單位向量,任意兩行正交就是兩行點乘結果為0,而因為是單位向量,所以任意行點乘自己結果為1。對於3x3正交矩陣,每行是一個3維向量,兩個3維向量正交的幾何意義就是這兩個向量相互垂直。所以3x3正交矩陣的三行可以理解為一個...