自定义一元/二进制Expr() eigen3 的参数

Arguments for custom unary/binaryExpr() eigen3

本文关键字:eigen3 Expr 参数 二进制 一元 自定义      更新时间:2023-10-16

我试图通过在 eigen3 对象上使用系数级运算来消除嵌套的循环。为了实现这一点,我必须泛化一个已经存在的函数,以便我可以自定义系数运算。

我发现 eigen 提供了两个函数,unaryExpr() 和 binaryExpr()(文档),它们允许在特征数组上实现自定义系数操作。但是,据我了解,您只能为这些表示数组本身系数的函数提供一两个参数。我也想将其他参数传递给这个函数,因为我需要这些其他参数来完成计算。

我想概括以下函数

inline Complex expValue(int twoMS, int twoMSPrime, const Matrix2cd& mat)
{
const Vector2cd& bra = getSpinBasisState(twoMSPrime);
const Vector2cd& ket = getSpinBasisState(twoMS);
return bra.adjoint()*mat*ket;
}

我存储了 twoMS 和 twoMSPrime 的所有可能值组合,如下所示的数组中

Eigen::ArrayXXd spinCGPart(16, 2);

因此,有 16 种不同的组合和两列,一列用于两个 MS,一个用于两个 MSPrime。 与其遍历所有不同的组合,我想实现这样的系数操作

Eigen::ArrayXXcd result(16, 1);
result = spinCGPart.col(0).binaryExpr(spinCGPart.col(1), generalExpVal);

其中 generalExpVal 应该是这样的

complex generalExpVal(int a, int b, const Matrix2cd& mat) const 
{
const Vector2cd& bra = getSpinBasisState(b);
const Vector2cd& ket = getSpinBasisState(a);
return bra.adjoint()*mat*ket;
}

我坚持实现最后一个功能。二进制Expr()的文档看起来不允许为函数提供额外的参数。是这样吗?我需要传递 mat 作为参数,因为它在整个计算过程中不断变化。任何关于本征或其他思考问题方式的建议都将非常有帮助和感激!

仍然不确定您在这里实际要实现的目标,但是在二进制函子中引用其他对象的最简单方法(使用 C++11 或更高版本)是使用 lambda 表达式:

result = spinCGPart.col(0).binaryExpr(spinCGPart.col(1), 
[&](int a, int b){return generalExpVal(a,b,mat);});

完全编译示例:https://godbolt.org/z/PBJJRW

使用C++03,您可以使用辅助结构手动执行此操作,或者使用boost::bind.