Хобрук: Ваш путь к мастерству в программировании

Сопоставление Eigen C++ и Python

Я новичок в 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 не следует изменять, так как это отправная точка алгоритма, и я не хочу, чтобы его модифицировали.

Заранее спасибо!

01.12.2020

  • Я не знаю внутреннего формата Py_buffer, но преобразование его в (Eigen::VectorXd *) почти наверняка обречено на провал. 02.12.2020

Новые материалы

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..