特征向量签署连续的功率迭代

时间:2018-03-09 05:33:57

标签: c++ math svd eigenvalue eigenvector

我必须确定对称矩阵的特征值和特征向量。我正在使用功率迭代方法和热门通货紧缩。

考虑测试用例:

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];
                }
            }
        }
    } 

0 个答案:

没有答案