Я новичок в C++ и, вероятно, задаю очень тривиальный вопрос, но я не смог найти четкого ответа.
Я создал функцию на C++, которая возвращает Eigen VectorXd (сейчас форма, output
). Давайте вызовем эту функцию funct
. Такая функция принимает в качестве аргумента 3 лямбда-функции и собственный векторXd.
Мне нужно сопоставить output
с Python.
Для этого я пробовал несколько вещей.
С одной стороны, я сделал то, что предлагается в этом вопросе: Вернуть массив Eigen::Matrix из C++ в Python без копирования, но я получаю сегмент. вина.
С другой стороны, я создал массив Python с именем to_fill_py
и отправил его на C++ для заполнения output
. Однако, когда я печатаю значения output
в Python и в C++, они не совпадают (это похоже на смещение malloc).
Фрагмент моего кода:
//Setting variables
PyObject *pyVec, to_fill_py;
vec = (double *)PyArray_DATA(pyVec);
to_fill = (double *)PyArray_DATA(to_fill_py);
Eigen::Map<Eigen::VectorXd> eigenVec(vec, N); //N a number coming from Python
//Do function
auto [output, dummy1, dummy2] = funct(lmabdaFunct1, lambdaFunct2, lambdaFunct3, eigenVec);
// Vector output needs to be mapped to Python
// 1 - Stackoverflow suggestion. Getting a segmentation fault.
Py_buffer view = {};
Eigen::VectorXd * ptr = (Eigen::VectorXd *)view.
for (int i = 0; i < N; ++i) {
ptr[i] = output;
}
PyBuffer_Release(&view);
// 2 - "Brute force" option. Not equal results in Python and in C++
for (int l=0; l < output.size(); l++) {
to_fill[l] = *(output.data() + l);
}
Вызов в питоне очень прост. Это выглядит как
to_fill_py = np.ones(N)
pyVec = np.ones(N)
funct_in_c(to_fill_py, pyVec, N,...)
Я должен сказать, что pyVec не следует изменять, так как это отправная точка алгоритма, и я не хочу, чтобы его модифицировали.
Заранее спасибо!