我必须确定对称矩阵的特征值和特征向量。我正在使用功率迭代方法和热门通货紧缩。
考虑测试用例:
A =
66 78 90
78 93 108
90 108 126
为此,主要特征向量是[0.4797 0.5724 0.6651]。我的代码给出了相同的输出。然而,在应用hotelling通货紧缩后,我得到的第二个主要特征向量是[0.7766 0.0756 -0.6253]。但是,MATLAB说它必须是[-0.7766 -0.0756 0.6253]。第三个特征向量是不正确的,因为第二个具有错误的符号。我的问题是:在应用功率迭代后,我们如何确定特征向量的方向(即符号)?
void eig(vector <vector<double> > A, vector <vector <double> > &eigen_vectors, vector <double> &eigen_values){
int n = data.size();
for(int loop=0;loop<n;loop++){
double c[n]; //Will store A*x
vector <double> x(n); //Will store the current eigen vector
for(int i=0;i<n;i++){
x[i] = 1;
}
double y,k=0;
do{
y=k;
k = 0;
for(int i=0;i<n;i++){
c[i]=0;
for (int j=0;j<n;j++){
c[i]+=A[i][j]*x[j];
}
k += c[i]*c[i];
}
k = sqrt(k);
for(int i=0;i<n;i++)
x[i]=c[i]/k;
}while (fabs(k-y)>0.000001);
/* The eigen value has been determined.
Now we have to determine the sign of eigen value.
To do this I am calculating A*v and comparing the sign with lambda*v */
for(int i=0;i<n;i++){
c[i]=0;
for(int j=0;j<n;j++){
c[i]+=A[i][j]*x[j];
}
}
//Determine the sign of k
if((x[0]<0 && c[0]>0) || (x[0]>0 && c[0]<0)){
k = -k;
}
eigen_values.push_back(k);
eigen_vectors.push_back(x);
double v[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
v[i][j] = x[i]*x[j];
}
}
// Apply hotelling deflation
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
A[i][j] = A[i][j] - k*v[i][j];
}
}
}
}