私はアルマジロを使用しています。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_matrix
にMat<T>::get_ref
から渡されます喜んでMat<float>
およびMat<double>
にありますが、実際には機能しません。
最初にMat<double>
に変換せずにMat<float>
の固有値/固有ベクトルを計算するにはどうすればよいですか?