2017-10-24 19 views
0

私はアルマジロを使用しています。ArmadilloはMat <float>でeig_genを実行できますか?

arma::Mat<float> m_matrix; 
arma::cc_vec  m_eigenvalues; 
arma::cx_mat  m_eigenvectors; 

私はこれをしたい:私はこれらの変数持つ

void calculate_eigens() 
{ 
    arma :: eig_gen (m_eigenvalues, m_eigenvectors, m_matrix); 
} 

のが、eig_genの関数プロトタイプは、これらのパラメータの種類を許可していません、それは3番目の引数は倍精度行列になりたいです。ここで

はgccのエラーです:

error: no matching function for call to ‘eig_gen(arma::cx_vec&, arma::cx_mat&, arma::Mat&)’

note: candidate: template typename arma::enable_if2::value, arma::Col > >::result arma::eig_gen(const arma::Base&)

armadillo_bits/fn_eig_gen.hpp:25:1: note: template argument deduction/substitution failed:

note: candidate expects 1 argument, 3 provided

これは、それを修正します。

void calculate_eigens() 
{ 
    auto tmp = arma::conv_to<arma::Mat<double>>::from(m_matrix); 

    arma :: eig_gen (m_eigenvalues, m_eigenvectors, tmp); 
} 

私はこの変換をしたくありません。私はアルマジロのソースに見て、eig_genこの関数にその主な作業を延期することを思わ:

template<typename eT> 
    inline 
    void 
    geev(char* jobvl, char* jobvr, blas_int* N, eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, eT* work, blas_int* lwork, blas_int* info) 
    { 
    arma_type_check((is_supported_blas_type<eT>::value == false)); 

    if(is_float<eT>::value) 
     { 
     typedef float T; 
     arma_fortran(arma_sgeev)(jobvl, jobvr, N, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); 
     } 
    else 
    if(is_double<eT>::value) 
     { 
     typedef double T; 
     arma_fortran(arma_dgeev)(jobvl, jobvr, N, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); 
     } 
    } 

それが仕事にeig_genのために意図ライブラリの作者のように私には思えるようeT*aパラメータは、m_matrixMat<T>::get_refから渡されます喜んでMat<float>およびMat<double>にありますが、実際には機能しません。

最初にMat<double>に変換せずにMat<float>の固有値/固有ベクトルを計算するにはどうすればよいですか?

答えて

1

入力行列だけでなく、すべての行列とベクトルの精度が同じであることを確認する必要があります。単精度の正しい使用法は、

arma::fmat  X; 
arma::cx_fvec eigvals; 
arma::cx_fmat eigvecs; 

// ... fill X with values ... 

arma::eig_gen(eigvals, eigvecs, X); 
です。
関連する問題