コード例 #1
0
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;
}
コード例 #2
0
ファイル: util.c プロジェクト: alvarouc/ica_gsl
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);
}
コード例 #3
0
ファイル: natif.c プロジェクト: gpichon/eigenproblems
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);
}