修改数据失败:
void wrap2(Eigen::MatrixXd& data){
是的,这不会修改原始的numpy数组,因为pybind必须首先
复制
它变成一个临时的特征矩阵来调用
wrap2
. 来自
pybind Eigen docs
:
上述的一个主要限制是,每个数据转换都隐式地包含一个副本,这可能是昂贵的(对于大型矩阵)和
不允许更改其(矩阵)参数的绑定函数
. pybind11允许您使用eigens eigen::ref类来解决这个问题…
因此,我们必须使用
Eigen::Ref
.
但这一个未能编译:
void wrap3(Eigen::Ref<Eigen::MatrixXd> data){
manipulate(data);
}
解决方案是定义一个接受
Eigen::参考
:
void manipulate(Eigen::Ref<Eigen::MatrixXd> data) {
data = data*2;
}
另一个选择是
manipulate
函数模板。参见Eigen的文档
Writing Functions Taking Eigen Types as Parameters
.