Я использую 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
?