自定义一元/二进制Expr() eigen3 的参数
Arguments for custom unary/binaryExpr() eigen3
我试图通过在 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
.
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- expr[{ .. }] 有什么用?
- CLion 无法在 macOS 上找到 Eigen3
- 在 Eigen3 中实现 Bartels-Stewart 算法 -- 仅实矩阵?
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 如何删除 Eigen3 矩阵中某些不连续的行和列?
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- c++ Eigen3 矩阵奇怪的行为
- 在 z3::expr 中使用C++字符串?
- 是否可以使用"if constexpr"来声明具有不同类型和init-expr的变量
- 如何处理使用不同类型索引的不同库(例如 stl 和 eigen3)的混合(size_t、int、..)
- 在插入顺序已知时填充 Eigen3 稀疏矩阵的策略
- 这是当前草案中[Expr.Ref]/(4.2)和[Expr.sub]/1之间的矛盾
- [expr.unary.op]/9 似乎暗示"运算符!()' 不能应用于下面的类型 A.但编译器不同意这一点
- 无法专用化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
- Python numpy 代码比 eigen3 或普通C++更高效
- 如何在ubuntu下使用eigen3的cholmodsupport
- 使用 MKL 编译 Eigen3
- 为什么这句话"The expression can be used only as the left-hand operand of a member function call"在 [expr.re
- 自定义一元/二进制Expr() eigen3 的参数