Template Size vs Dynamic Size


#1

I’ve noticed a few functions, such as quad_form_sym with the following signature:

template <typename TA, int RA, int CA, typename TB, int RB, int CB>
inline typename
boost::enable_if_c< boost::is_same<TA, var>::value ||
  boost::is_same<TB, var>::value,
  Eigen::Matrix<var, CB, CB> >::type
quad_form_sym(const Eigen::Matrix<TA, RA, CA>& A,
              const Eigen::Matrix<TB, RB, CB>& B)

Why are we using the template type TA and RA, instead of Eigen::Dynamic?


#2

I think the answer is that if you substitute Eigen::Dynamic for both TA and TB then it expects a matrix, whereas we can call it with TA or TB as 1, then it works with column vectors or row vectors.


#3

TA is the scalar type, so TA is going to be var or double or fvar<var>.

RA is the static rows and CA the static columns for argument A. The reason they’re template parameters is what Ben said, RA=1, CA=-1 is for vectors, RA=-1, CA=1 for row vectors, and RA=-1, CA=-1 for matrices. -1 is the value of Eigen::Dynamic.


#4

Thank you for the answer @bgoodri and @Bob_Carpenter.