自定义一元/ binaryExpr()eigen3的参数

问题描述 投票:0回答:1

我试图通过在eigen3对象上使用系数方法来消除嵌套for循环。为了实现这一点,我必须概括已经存在的函数,以便我可以使用自定义系数方法。

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

我想概括以下功能

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;
}

两个MS和两个MSPrime的值的所有可能组合都存储在这样的数组中

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;
}

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

c++ numerical-methods eigen3
1个回答
0
投票

仍然不确定你实际上在这里想要实现什么,但最简单的方法(使用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手动执行此操作。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.