У меня есть функция c ++, использующая eigen, которая обернута с помощью pybind11, так что я могу вызывать ее из python. Простая версия намеченной функции возвращает тип Eigen::MatrixXd
, который pybind успешно преобразует в двумерный массив Numpy.
Мне бы хотелось, чтобы эта функция могла возвращать либо список, либо кортеж таких матриц, либо трехмерный массив NumPy.
Я новичок в c ++, и документация для pybind не дает (насколько я понимаю) какого-либо направления. Пример макета ниже:
test.cpp
#include <pybind11/pybind11.h>
#include <pybind11/eigen.h>
#include <Eigen/Dense>
Eigen::MatrixXd test(Eigen::Ref<const Eigen::MatrixXd> x, double a)
{
Eigen::MatrixXd y;
y = x * a;
return y;
}
Eigen::MatrixXd *test2(Eigen::Ref<const Eigen::MatrixXd> x, Eigen::Ref<const Eigen::VectorXd> as)
{
Eigen::MatrixXd *ys = new Eigen::MatrixXd[as.size()];
for(unsigned int k = 0; k < as.size(); k++){
Eigen::MatrixXd& y = ys[k];
y = x * as[k];
}
return ys;
}
namespace py = pybind11;
PYBIND11_MODULE(test, m)
{
m.doc() = "minimal working example";
m.def("test", &test);
m.def("test2", &test2);
}
Я бы хотел, чтобы test2
вернул список или кортеж массивов.
В питоне:
import test
import numpy as np
x = np.random.random((50, 50))
x = np.asfortranarray(x)
a = 0.1
a2 = np.array([1.0, 2.0, 3.0])
y = test.test(x, a)
ys = test.test2(x, a2)
Массив y
соответствует ожидаемому, но ys
содержит только массив, соответствующий первому коэффициенту a2
.
Как мне изменить test2
, чтобы правильно возвращать более одного массива? 3D-массив также будет приемлемым.