bool Matrix::eig(vector<double> &eigval,Matrix *eigvec){ bool flag = false; if(this->rows!=this->cols){ cout<<"Inappropriate Input Matrix! Only SQUARE Matrix Permitted In EIGEN Calculating"<<endl; return false; } int size = rows; valarray<double> main_diag(size), minor_diag(size); Matrix q(size,size); Matrix digenvalue(size,size); digenvalue.setdata(data); double accuracy = 1.0e-8; int k=Householder(digenvalue,q,main_diag,minor_diag); if(k==0){ cout<<"The Matrix is not SYMMETRICAL"<<endl; return false; } k = QR(main_diag,minor_diag,q,accuracy,160); if(k<0){ cout<<"Calculating failed in Required Iteration Times"<<endl; return false; } vector<int> id; sortArray(main_diag,id); for(int j=0;j<size;j++) eigval.push_back(main_diag[j]); q = q.sort(id,2); *eigvec = q; flag = true; return flag; }
void ExplicitTriang( ElementalMatrix<F>& A ) { DEBUG_ONLY(CSE cse("rq::ExplicitTriang")) DistMatrix<F,MD,STAR> t(A.Grid()); DistMatrix<Base<F>,MD,STAR> d(A.Grid()); Householder( A, t, d ); MakeTrapezoidal( UPPER, A, A.Width()-A.Height() ); }
void ExplicitTriang( Matrix<F>& A ) { DEBUG_ONLY(CSE cse("rq::ExplicitTriang")) Matrix<F> t; Matrix<Base<F>> d; Householder( A, t, d ); MakeTrapezoidal( UPPER, A, A.Width()-A.Height() ); }
void ExplicitTriang( AbstractDistMatrix<F>& A ) { DEBUG_ONLY(CallStackEntry cse("rq::ExplicitTriang")) DistMatrix<F,MD,STAR> t(A.Grid()); DistMatrix<Base<F>,MD,STAR> d(A.Grid()); Householder( A, t, d ); MakeTrapezoidal( UPPER, A, A.Width()-A.Height() ); }
inline void Householder( Matrix<F>& A ) { #ifndef RELEASE CallStackEntry entry("qr::Householder"); #endif Matrix<F> t; Householder( A, t ); }
inline void Householder( DistMatrix<F>& A ) { #ifndef RELEASE CallStackEntry entry("qr::Householder"); #endif DistMatrix<F,MD,STAR> t(A.Grid()); Householder( A, t ); }
void ExplicitTriang( AbstractDistMatrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CallStackEntry cse("qr::ExplicitTriang")) DistMatrix<F,MD,STAR> t(A.Grid()); DistMatrix<Base<F>,MD,STAR> d(A.Grid()); if( ctrl.colPiv ) { DistMatrix<Int,VC,STAR> p(A.Grid()); BusingerGolub( A, t, d, p, ctrl ); } else Householder( A, t, d ); A.Resize( t.Height(), A.Width() ); MakeTrapezoidal( UPPER, A ); }
void ExplicitTriang( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CallStackEntry cse("qr::ExplicitTriang")) Matrix<F> t; Matrix<Base<F>> d; if( ctrl.colPiv ) { Matrix<Int> p; BusingerGolub( A, t, d, p, ctrl ); } else Householder( A, t, d ); A.Resize( t.Height(), A.Width() ); MakeTrapezoidal( UPPER, A ); }
void ExplicitTriang( ElementalMatrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_CSE DistMatrix<F,MD,STAR> householderScalars(A.Grid()); DistMatrix<Base<F>,MD,STAR> signature(A.Grid()); if( ctrl.colPiv ) { DistPermutation Omega(A.Grid()); BusingerGolub( A, householderScalars, signature, Omega, ctrl ); } else Householder( A, householderScalars, signature ); A.Resize( householderScalars.Height(), A.Width() ); MakeTrapezoidal( UPPER, A ); }
void ExplicitTriang( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_CSE Matrix<F> householderScalars; Matrix<Base<F>> signature; if( ctrl.colPiv ) { Permutation Omega; BusingerGolub( A, householderScalars, signature, Omega, ctrl ); } else Householder( A, householderScalars, signature ); A.Resize( householderScalars.Height(), A.Width() ); MakeTrapezoidal( UPPER, A ); }
void ExplicitTriang( ElementalMatrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CSE cse("qr::ExplicitTriang")) DistMatrix<F,MD,STAR> t(A.Grid()); DistMatrix<Base<F>,MD,STAR> d(A.Grid()); if( ctrl.colPiv ) { DistPermutation Omega(A.Grid()); BusingerGolub( A, t, d, Omega, ctrl ); } else Householder( A, t, d ); A.Resize( t.Height(), A.Width() ); MakeTrapezoidal( UPPER, A ); }
void ExplicitTriang( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CSE cse("qr::ExplicitTriang")) Matrix<F> t; Matrix<Base<F>> d; if( ctrl.colPiv ) { Permutation Omega; BusingerGolub( A, t, d, Omega, ctrl ); } else Householder( A, t, d ); A.Resize( t.Height(), A.Width() ); MakeTrapezoidal( UPPER, A ); }
int eig( int N, const lower_triangular_matrix& C, valarray<double>& diag, square_matrix& Q, int niter) { int ret; int i, j; if (niter == 0) niter = 30*N; for (i=0; i < N; ++i) { vector<double>::const_iterator row = C[i]; for (j = 0; j <= i; ++j) Q[i][j] = Q[j][i] = row[j]; } double* rgtmp = new double[N+1]; Householder( N, Q, diag, rgtmp); ret = QLalgo( N, diag, Q, niter, rgtmp+1); delete [] rgtmp; return ret; }
/* ========================================================= */ static void Eigen( int N, double **C, double *diag, double **Q, double *rgtmp) /* * Calculating eigenvalues and vectors. * Input: * N: dimension. * C: symmetric (1:N)xN-matrix, solely used to copy data to Q * niter: number of maximal iterations for QL-Algorithm. * rgtmp: N+1-dimensional vector for temporal use. * Output: * diag: N eigenvalues. * Q: Columns are normalized eigenvectors. */ { int i, j; if (rgtmp == NULL){ /* was OK in former versions */ //FATAL("cmaes_t:Eigen(): input parameter double *rgtmp must be non-NULL", 0,0,0); fprintf(stderr,"cmaes_t:Eigen(): input parameter double *rgtmp must be non-NULL"); exit(1); } /* copy C to Q */ if (C != Q) { for (i=0; i < N; ++i) for (j = 0; j <= i; ++j) Q[i][j] = Q[j][i] = C[i][j]; } #if 0 Householder( N, Q, diag, rgtmp); QLalgo( N, diag, Q, 30*N, rgtmp+1); #else Householder2( N, Q, diag, rgtmp); QLalgo2( N, diag, rgtmp, Q); #endif }