📄 householder
字号:
Householder变换2007-07-16 18:33#include<iostream>
#include<math.h>
using namespace std;
#define n 5 //输入一个5维的向量,n的值可更改
int sign(float x) //定义符号函数
{
if(x<0) return -1;
else return 1;
}
void main()
{
cout<<"请输入X向量:\n";
int i,j;
double x[n],max,a=0,v[n],ww[n][n],y[n],w[n],vv=0,xx[n];
for(i=0;i<n;i++)
cin>>x[i];
for(i=0;i<n;i++)
xx[i]=x[i]; //为了保存x的初始值
max=fabs(x[0]);
for(i=0;i<n;i++)
{
if(max<fabs(x[i])) max=fabs(x[i]);
}
for(i=0;i<n;i++)
x[i]=x[i]/max;
for(i=0;i<n;i++)
a+=x[i]*x[i];
a=sqrt(a);
a=sign(x[0])*a;
x[0]=x[0]+a;
for(i=0;i<n;i++)
v[i]=x[i];
for(i=0;i<n;i++)
vv+=v[i]*v[i];
vv=sqrt(vv);
for(i=0;i<n;i++)
w[i]=v[i]/vv;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ww[i][j]=(-2)*w[i]*w[j];
for(i=0;i<n;i++)
ww[i][i]=1+ww[i][i]; //没有按照书上的步骤求v,用v的值来算,因为计算机中开方并不复杂,也不会增加计算量
cout<<"\nX向量的Householder变换矩阵是:\n";
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<ww[i][j]<<" ";
cout<<"\n";
}
for(i=0;i<n;i++)
{
y[i]=0;
for(j=0;j<n;j++)
y[i]+=ww[i][j]*xx[j]; //此处应注意,要乘以x的初始值,如果直接写x[i],则得不到正确结果,因为x已经被赋其他值
}
cout<<"\n经过Householder变换,X向量变成了:\n";
for(i=0;i<n;i++)
cout<<y[i]<<" ";
cout<<"\n";
cout<<"\n";
}
//经过变换,显示出x的分量已经很小,则可以认为为零,比如10的负16次幂,可以认为是零
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -