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());
我正在研究使用 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());