gpt4 book ai didi

python - 如何将 Eigen::Ref 与 pybind11 一起使用?

转载 作者:行者123 更新时间:2023-11-30 04:55:32 28 4
gpt4 key购买 nike

我正在使用 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

最佳答案

This fails to modify the data:

void wrap2(Eigen::MatrixXd& data){

是的,这不会修改原始的 numpy 数组,因为 pybind 必须首先将其复制到一个临时的 Eigen 矩阵中以调用 wrap2。来自pybind Eigen docs :

One major limitation of the above is that every data conversion implicitly involves a copy, which can be both expensive (for large matrices) and disallows binding functions that change their (Matrix) arguments. Pybind11 allows you to work around this by using Eigen’s Eigen::Ref class...

因此,我们必须使用Eigen::Ref

And this one fails fails to compile:

void wrap3(Eigen::Ref<Eigen::MatrixXd> data){
manipulate(data);
}

解决方案是定义一个接受 Eigen::Ref 的函数:

void manipulate(Eigen::Ref<Eigen::MatrixXd> data) {
data = data*2;
}

另一种选择是使 manipulate 成为函数模板。请参阅 Eigen 关于 Writing Functions Taking Eigen Types as Parameters 的文档.

关于python - 如何将 Eigen::Ref 与 pybind11 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52979815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com