Как использовать Eigen :: Ref с pybind11? - PullRequest
0 голосов
/ 25 октября 2018

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

1 Ответ

0 голосов
/ 28 октября 2018

Не удается изменить данные:

void wrap2(Eigen::MatrixXd& data){

Да, это не приведет к изменению исходного массива numpy, поскольку pybind должен сначала скопировать его ввременная собственная матрица для вызова wrap2.Из pybind Eigen docs :

Одним из основных ограничений вышесказанного является то, что каждое преобразование данных неявно включает в себя копию, которая может быть как дорогой (для больших матриц), так и * 1014.* запрещает связывание функций, которые изменяют свои (матричные) аргументы .Pybind11 позволяет обойти это, используя класс Eigen :: Ref Eigen ...

Следовательно, мы должны использовать 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 по Написание функций, принимающих собственные типы в качестве параметров .

...