- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我是一名优秀的程序员,十分优秀!