Eigen是否支持符号运算?有哪些可行的实现方案?
Eigen符号矩阵运算解决方案
方案1:Eigen与SymEngine耦合实现
Eigen本身完全支持自定义标量类型,你认为两者无法耦合通常是缺少标量类型的特质适配步骤,只要完成以下操作即可实现符号矩阵运算:
- 特化
Eigen::NumTraits<SymEngine::Expression>类型,补充Eigen要求的类型标签、常量定义 - 补全SymEngine符号类型与数值类型混合运算的运算符重载(部分版本SymEngine已经内置了相关实现,可直接使用)
适配完成后,可直接按照常规Eigen矩阵的操作方式编写符号计算逻辑,和Matlab符号矩阵的使用体验一致,示例代码如下:
#include <Eigen/Core> #include <symengine/expression.h> int main() { using SymEngine::Expression; // 定义符号变量 Expression x("x"), y("y"), z("z"), w("w"); // 声明2x2符号矩阵 Eigen::Matrix<Expression, 2, 2> sym_mat; sym_mat << x, y, z, w; // 直接调用Eigen原生接口计算行列式、逆矩阵 Expression det = sym_mat.determinant(); Eigen::Matrix<Expression, 2, 2> inv_mat = sym_mat.inverse(); return 0; }
计算得到的行列式、逆矩阵元素都会自动生成对应的符号表达式,也可直接调用SymEngine的simplify接口做表达式化简。
方案2:无需适配的替代实现方案
如果不想做跨库适配,也可以选择以下成熟实现方案:
- GiNaC:老牌C++符号运算框架,官方提供了Eigen适配扩展,可直接声明
Eigen::Matrix<GiNaC::ex, Eigen::Dynamic, Eigen::Dynamic>类型的符号矩阵,原生支持矩阵求逆、特征值符号求解、代数化简等功能,适配成本几乎为0 - SymbolicCpp:原生支持符号矩阵运算的C++库,内置类Eigen的矩阵操作API,无需额外适配就可以直接完成符号矩阵的各类运算,适合轻量级场景使用
- 模板元编程实现:如果只有基础四则运算、无复杂化简需求,可以基于C++模板元编程实现简易符号运算逻辑,无需引入任何第三方依赖,编译期即可完成表达式推导
内容的提问来源于stack exchange,提问作者iuming
相关产品推荐
相关产品推荐

