Eigen no matching function for call .dot()?

Eigen no matching function for call .dot()?

本文关键字:dot call for no matching function Eigen      更新时间:2023-10-16

在我的代码中,我定义了一个模板类,其operator()定义如下:

template<class Integrator, int ORDER>
inline double operator() (FiniteElement<Integrator, ORDER,2,3>& currentfe_,
                          int i, int j, int iq, int ic = 0)
{
    Real s = 0;
    Eigen::Matrix<double,2,1> grad_phi_i;
    Eigen::Matrix<double,2,1> grad_phi_j;
    grad_phi_i(0) = ...
    grad_phi_i(1) = ...
    grad_phi_j(0) = ...
    grad_phi_j(1) = ...
    s = grad_phi_i.dot(currentfe_.metric().dot(grad_phi_j));
    return s;
}

哪里

currentfe_.metric()

是类FiniteElement返回Eigen::Matrix<double,2,2>的方法。

我得到的错误是:

error: no matching function for call to ‘Eigen::Matrix<double, 2, 1>::dot(Eigen::internal::scalar_product_traits<double, double>::ReturnType)’
s = grad_phi_i.dot(currentfe_.metric().dot(grad_phi_j));

我也想不通为什么。

这是因为矩阵.dot()方法仅适用于向量之间的标量积(请参阅文档)。在这里你可以看到矩阵和向量之间的乘法是用*执行的。

一个可能的解决方案是:

grad_phi_i*currentfe_.metric()*grad_phi_j.transpose()