使用 Eigen 库了解模板和代码

Unterstanding the templates and the code with Eigen Library

我在学校有这个代码:

#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 是一个 Matrix 类型,如 MatrixX"Scalar"。现在我纠结于 dynMat_t::Scalar 的含义,这是 matrix/vector 条目的 value_type 的描述吗?为什么需要类型 entry_t

我看不出这段代码的意义所在。

非常感谢您的帮助。

确实,Scalar是一个指定标量字段的模板参数(可以是标准类型或用户定义类型),参见official Eigen documentation and the line 97 of the source code here,其中

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).