bool eigenvalue_decomposition_sym(Mda& U, Mda& S, Mda& X) { //X=U*diag(S)*U' //X is MxM, U is MxM, S is 1xM //X must be real and symmetric int M = X.N1(); if (M != X.N2()) { qWarning() << "Unexpected problem in eigenvalue_decomposition_sym" << X.N1() << X.N2(); exit(-1); } U.allocate(M, M); S.allocate(1, M); double* Uptr = U.dataPtr(); double* Sptr = S.dataPtr(); double* Xptr = X.dataPtr(); for (int ii = 0; ii < M * M; ii++) { Uptr[ii] = Xptr[ii]; } //'V' means compute eigenvalues and eigenvectors (use 'N' for eigenvalues only) //'U' means upper triangle of A is stored. //QTime timer; timer.start(); int info = LAPACKE_dsyevd(LAPACK_COL_MAJOR, 'V', 'U', M, Uptr, M, Sptr); //printf("Time for call to LAPACKE_dsyev: %g sec\n",timer.elapsed()*1.0/1000); if (info != 0) { qWarning() << "Error in LAPACKE_dsyev" << info; return false; } return true; }
void dc_eig(gsl_matrix *sym, gsl_vector *eval, gsl_matrix *evec ,size_t NCOMP){ // Divide and conquer Eigen decomposition // gsl_matrix *evec = gsl_matrix_alloc(NSUB, NSUB); // gsl_vector *eval = gsl_vector_alloc(NCOMP); //eigen values size_t NSUB = sym->size1; gsl_vector *eval_temp =gsl_vector_alloc(NSUB); LAPACKE_dsyevd(LAPACK_ROW_MAJOR, 'V', 'U', NSUB, sym->data, NSUB, eval_temp->data); gsl_eigen_symmv_sort (eval_temp, sym, GSL_EIGEN_SORT_ABS_DESC); gsl_matrix_view temp = gsl_matrix_submatrix(sym, 0,0 , NSUB, NCOMP); gsl_matrix_memcpy(evec,&temp.matrix); gsl_vector_view temp_vec = gsl_vector_subvector(eval_temp, 0, NCOMP); gsl_vector_memcpy(eval, &temp_vec.vector); gsl_vector_free(eval_temp); }
void solve_entire_dc(int n, double *A, double *E, double *Q, char type){ (void) Q; int info = LAPACKE_dsyevd(LAPACK_COL_MAJOR, type, 'L', n, A, n, E); assert(!info); }