用Eigen库理解模板和代码

Unterstanding the templates and the code with Eigen Library

本文关键字:代码 Eigen      更新时间:2023-10-16

我在学校有这个守则:

#include <Eigen/Dense>
template<<typename Scalar>
void Typedemo(unsigend int dim)
{
using dynMat_t =
Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>; 
using dynColVec_t= Eigen::Matrix<Scalar,Eigen::Dynamic,1>; 
using dynRowVec_t = Eigen::Matrix<Scalar,1,Eigen::Dynamic>; 
using index_t = typename dynMat_t::Index;
using entry_t = typename dynMat_t::Scalar;
dynColVec_t colvec(dim);
dynRowVec_t rowvec(dim); 
for (index_t i=0; i< colvec.size(); ++i) colvec(i) = (Scalar)i; 
for (index_t i=0; i< rowvec.size(); ++i) rowvec(i) = (Scalar)1/(i+1);
dynMat_t vecprod = colvec*rowvec;
const int nrows = vecprod.rows();
const int ncols = vecprod.cols(); 
}

我认为Scalar是模板类型的名称(可能被实例化为double或int), dynMat_t是Matrixtype,如MatrixX"Scalar"。现在我与dynMat_t::Scalar的含义斗争,这是矩阵/向量条目的value_type的描述,为什么你需要类型entry_t ?

我看不出这段代码有什么意义。

非常感谢您的帮助

确实,Scalar是一个模板参数,它指定标量字段(可以是标准类型或用户定义类型),请参阅官方Eigen文档和源代码的第97行,在这里

typedef typename internal::traits<Derived>::Scalar Scalar;

entry_t只是一个类型别名,在这种情况下和Scalar一样,所以我猜它只是为了统一符号而使用的。

PS:你的代码中有一个错别字,template<<typename Scalar> void Typedemo(unsigend int dim)应该是template<typename Scalar> void Typedemo(unsigend int dim)