2015-09-20 2 views
0

Я получил этот код в школе:Unterstanding шаблонов и код с Эйгеном библиотекой

#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 это имя типа шаблона (который может быть реализован в виде двойной или межд) и dynMat_t это Matrixtype, как MatrixX «Скаляр». Теперь я борюсь со значением dynMat_t::Scalar, это описание значения_типа элементов матрицы/вектора и зачем вам нужен тип entry_t?

Я не вижу смысла в этом коде.

Большое спасибо за любую помощь.

+0

Скаляр выглядит как любой тип, который вам нужно увидеть, это шаблон. Скорее всего, это матрица, но я смущен тем, что вы спрашиваете. – Phorce

+0

Может быть, у 'Eigen :: Matrix' есть typenames' Index' и «Скаляр»? Я не уверен, как выглядит «Eigen :: Matrix», поэтому вы можете посмотреть там. – funkysidd

ответ

0

Действительно, Scalar является параметром шаблона, который задает скалярное поле (может быть либо стандартный тип или определенный пользователем тип), см official Eigen documentation и линию 97 исходного кода 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).

Смежные вопросы