Eigen 自然对数函数的问题:"implicit instantiation of undefined template"

Problem with Eigen natural log function: "implicit instantiation of undefined template"

我正在研究使用 Eigen 进行涉及线性代数计算的化学模拟。

这是我的代码,用于在给定底物浓度的电流矢量的情况下确定吉布斯自由能产率:

#define R 8.314   // Gas constant - J mol^-1 K^-1
#define T 298.0   // Temperature - K

typedef Eigen::MatrixXf Matrix;
typedef Eigen::VectorXf Vector;

Vector calculateGibbs(Vector C, Matrix S, Vector F) {
    /** Calculate value of G vector based on current
        concentration vector C, stoichiometric matrix S, temperature T,
        and standard ∆G˚ vector F.

            Formula Used: G = S^t * (F + RT ln C)

        Where R is the universal gas constant (see line 16),
        and S^t is the transpose of S.
    */
    double RT = R * T;
    return S.transpose() * (F + RT * C.log());
}

当我尝试编译调用此函数的代码时,出现以下错误:

error: implicit instantiation of
      undefined template 'Eigen::MatrixLogarithmReturnValue<Eigen::Matrix<float,
      -1, 1, 0, -1, 1> >'
    return S.transpose() * (F + RT * C.log());
                                       ^
/usr/local/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h:287:34: note: 
      template is declared here
template<typename Derived> class MatrixLogarithmReturnValue

不确定我做错了什么。这是我引用的自然对数函数的文档:https://eigen.tuxfamily.org/dox/group__CoeffwiseMathFunctions.html.

任何人都可以澄清我做错了什么吗?非常感谢任何帮助。

编辑: 明确地说,我的目标是弄清楚如何使用 Eigen 框架获取向量的自然对数。

解决方法在这里!

我需要将 C 向量转换为数组,调用 log 方法,然后将其转换回矩阵!矢量加法最终仍然有效,因为在特征向量中是矩阵的子类(不像 numpy,它区分 N-dimensional 数组和 1xN 维数组)。

Eigen 的大部分 coefficient-wise 操作,包括 .log()refer to Array objects。 coefficient-wise 日志操作不能应用于您示例中使用的 Matrix 类型(或 Vector typedef,它只是 Matrix 的一个特例)。

使用.array().matrix()可以在类型之间切换。在您的情况下,返回值可能是:

return S.transpose() * (F.array() + RT * C.array().log()).matrix();

或者,等价地,

return S.transpose() * (F + RT * C.array().log().matrix());