如何将 Eigen::Ref 与 pybind11 一起使用?
How to use Eigen::Ref with pybind11?
我正在使用pybind来包装C++代码。
给定以下函数,该函数最初是库的一部分,不应修改:
void manipulate(Eigen::MatrixXd& data) {
data = data*2;
}
使用 pybind,我可以将其包装为:
#include <pybind11/pybind11.h>
#include <pybind11/eigen.h>
#include <Eigen/LU>
namespace py = pybind11;
void wrap1(Eigen::Ref<Eigen::MatrixXd> data){
Eigen::MatrixXd mData(data);
manipulate(mData);
data = mData;
}
PYBIND11_PLUGIN(cod) {
pybind11::module m("cod", "auto-compiled c++ extension");
m.def("wrap1", &wrap1);
return m.ptr();
}
但这会产生不必要的复制mData
.
这将无法修改数据:
void wrap2(Eigen::MatrixXd& data){
manipulate(data);
}
这个失败编译失败:
void wrap3(Eigen::Ref<Eigen::MatrixXd> data){
manipulate(data);
}
如何避免创建同样data
wrap2
、wrap3
或等效std::swap
的副本?
这将无法修改数据:
void wrap2(Eigen::MatrixXd& data){
是的,这不会修改原始的numpy数组,因为pybind必须首先将其复制到临时特征矩阵中才能调用wrap2
。来自 pybind Eigen 文档:
上述的一个主要限制是每个数据转换都隐式涉及一个副本,这可能既昂贵(对于大型矩阵(,又不允许更改其(矩阵(参数的绑定函数。Pybind11 允许您通过使用 Eigen 的 Eigen::Ref 类来解决此问题...
因此,我们必须使用Eigen::Ref
.
这个失败编译失败:
void wrap3(Eigen::Ref<Eigen::MatrixXd> data){ manipulate(data); }
解决方案是定义一个接受Eigen::Ref
的函数:
void manipulate(Eigen::Ref<Eigen::MatrixXd> data) {
data = data*2;
}
另一种选择是将manipulate
作为函数模板。请参阅 Eigen 关于编写将特征类型作为参数的函数的文档。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 用pybind11包装C++抽象类时出错
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 使用Pybind11向Python公开Eigen::张量
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- Python 3.8 不能与 Pybind11 一起导入 [Windows]
- 如何将特征与 Pybind11 一起使用
- 如何将 Pybind11 与 CMAKE 一起使用以链接 2 个模块
- Python 和 C++:如何将 pybind11 与包括 GSL 库在内的 Cmakelist 一起使用