@@ -16,16 +16,19 @@ namespace math {
1616 *
1717 * Specialized for double values for efficiency.
1818 *
19- * @tparam Cb number of columns in matrix B, can be Eigen::Dynamic
19+ * @tparam EigMat1 type of the first matrix
20+ * @tparam EigMat2 type of the second matrix
21+ *
2022 * @param[in] A Matrix
2123 * @param[in] B Matrix
2224 * @param[in] t double
23- * @return exponential of At multiplies B
25+ * @return exponential of At multiplied by B
2426 */
25- template <int Cb>
26- inline Eigen::Matrix<double , -1 , Cb> scale_matrix_exp_multiply (
27- const double & t, const Eigen::MatrixXd& A,
28- const Eigen::Matrix<double , -1 , Cb>& B) {
27+ template <typename EigMat1, typename EigMat2,
28+ require_all_eigen_t <EigMat1, EigMat2>* = nullptr ,
29+ require_all_vt_same<double , EigMat1, EigMat2>* = nullptr >
30+ inline Eigen::Matrix<double , Eigen::Dynamic, EigMat2::ColsAtCompileTime>
31+ scale_matrix_exp_multiply (const double & t, const EigMat1& A, const EigMat2& B) {
2932 check_square (" scale_matrix_exp_multiply" , " input matrix" , A);
3033 check_multiplicable (" scale_matrix_exp_multiply" , " A" , A, " B" , B);
3134 if (A.size () == 0 ) {
@@ -39,20 +42,22 @@ inline Eigen::Matrix<double, -1, Cb> scale_matrix_exp_multiply(
3942 * Return product of exp(At) and B, where A is a NxN matrix,
4043 * B is a NxCb matrix and t is a scalar.
4144 *
42- * Generic implementation when arguments are not double.
45+ * Generic implementation when arguments are not all double.
4346 *
44- * @tparam Ta scalar type matrix A
45- * @tparam Tb scalar type matrix B
46- * @tparam Cb number of columns in matrix B, can be Eigen::Dynamic
47+ * @tparam Tt type of \c t
48+ * @tparam EigMat1 type of the first matrix
49+ * @tparam EigMat2 type of the second matrix
4750 * @param[in] A Matrix
4851 * @param[in] B Matrix
4952 * @param[in] t double
50- * @return exponential of At multiplies B
53+ * @return exponential of At multiplied by B
5154 */
52- template <typename Tt, typename Ta, typename Tb, int Cb>
53- inline Eigen::Matrix<return_type_t <Tt, Ta, Tb>, -1 , Cb>
54- scale_matrix_exp_multiply (const Tt& t, const Eigen::Matrix<Ta, -1 , -1 >& A,
55- const Eigen::Matrix<Tb, -1 , Cb>& B) {
55+ template <typename Tt, typename EigMat1, typename EigMat2,
56+ require_all_eigen_t <EigMat1, EigMat2>* = nullptr ,
57+ require_any_not_vt_same<double , Tt, EigMat1, EigMat2>* = nullptr >
58+ inline Eigen::Matrix<return_type_t <Tt, EigMat1, EigMat2>, Eigen::Dynamic,
59+ EigMat2::ColsAtCompileTime>
60+ scale_matrix_exp_multiply (const Tt& t, const EigMat1& A, const EigMat2& B) {
5661 check_square (" scale_matrix_exp_multiply" , " input matrix" , A);
5762 check_multiplicable (" scale_matrix_exp_multiply" , " A" , A, " B" , B);
5863 if (A.size () == 0 ) {
0 commit comments