numpy — встраивание Python в C ++ с вызовом двух функций и передачей массива

Я пытаюсь встроить функции Python в мой код C ++ для выполнения некоторых символических и алгебраических операций.

Моя идея:
Я хочу создать матрицу с символическими переменными в зависимости от некоторых входных переменных. Эту матрицу я хочу использовать потом в другой функции. Эта функция генерирует некоторые координаты из символической матрицы. И я хочу затем передать эти результаты в мой код C ++ обратно.

Моя проблема:
У меня есть проблема, чтобы получить эту матрицу из Python в мой код C ++ и вернуться к другой функции в качестве ввода. Потому что я хочу передать символьную матрицу через c ++ другой функции python, которая должна генерировать из этой матрицы результаты. Просто, чтобы попробовать мой код на Python и интеграцию в C ++, я написал код ниже.

Редактировать:
Чтобы сделать мой вопрос более конкретным, я написал всю работу, которую я хочу сделать с этими функциями в Python. Для пояснения мне нужна одна функция, которая генерирует символьную матрицу, а другая должна вычислять значения. И для расчета значения приходят изнутри моего кода C ++.

Вот пример, написанный на Python:

from sympy import *
import numpy as npdef main():
start_pos = [1,2,3]
end_pos = [4,5,6]

generic_function = generate_symbolic_transformation(start_pos,end_pos)
calculate_symbolic_transformation(generic_function,90,0.5);

# Calculation of the symbolic transformation depending on the input
def calculate_symbolic_transformation(generic_function,thetay_value,k_value):
thetay = symbols('thetay')
k = symbols('k')
transf_matrix = MatrixSymbol('tm',4,4)
transf_matrix = Matrix(transf_matrix)
transf_matrix = sympify(generic_function)
transf_matrix = transf_matrix.subs([(thetay,thetay_value),(k,k_value)])
print transf_matrix
return 1

# Generation of the symbolic transformation depending on the input
def generate_symbolic_transformation(Start_pos_coords,End_pos_coords):

# Symbolic startposition
Start_pos = MatrixSymbol('S',3,1)
Start_pos = Matrix(Start_pos)
Start_pos[0] = Start_pos_coords[0]
Start_pos[1] = Start_pos_coords[1]
Start_pos[2] = Start_pos_coords[2]

print Start_pos

# Symbolic endposition
End_pos = MatrixSymbol('E',3,1)
End_pos = Matrix(End_pos)
End_pos[0] = End_pos_coords[0]
End_pos[1] = End_pos_coords[1]
End_pos[2] = End_pos_coords[2]

print End_pos

# Symbolic rotation matric
R = MatrixSymbol('R',3,3)

# Symbolic transformation matric
T = MatrixSymbol('T',4,4)

# Necessary symbolic variabls
k = symbols('k')
thetax = symbols('thetax')
thetay = symbols('thetay')
thetaz = symbols('thetaz')

# For rotation of EulerAngles RzRyRx:
Rx = MatrixSymbol('Rx',3,3)
Ry = MatrixSymbol('Ry',3,3)
Rz = MatrixSymbol('Rz',3,3)

# Filling Rx rotation matric
#   |   1           0                   0         |
#   |   0       -cos(thetax)      sin(thetax)     |
#   |   0        sin(thetax)      cos(thetax)     |

Rx = Matrix(Rx)
Rx[0,0] = 1
Rx[0,1] = 0
Rx[0,2] = 0
Rx[1,0] = 0
Rx[1,1] = cos(thetax)
Rx[1,2] = -sin(thetax)
Rx[2,0] = 0
Rx[2,1] = sin(thetax)
Rx[2,2] = cos(thetax)

# Filling Ry rotation matric
#   |    cos(thetay)        0      sin(thetay)     |
#   |          0            1           0          |
#   |   -sin(thetay)        0      cos(thetay)     |

Ry = Matrix(Ry)
Ry[0,0] = cos(thetay)
Ry[0,1] = 0
Ry[0,2] = sin(thetay)
Ry[1,0] = 0
Ry[1,1] = 1
Ry[1,2] = 0
Ry[2,0] = -sin(thetay)
Ry[2,1] = 0
Ry[2,2] = cos(thetay)

# Filling Rz rotation matric
#   |    cos(thetaz)   -sin(thetaz)      0     |
#   |    sin(thetaz)    cos(thetaz)      0     |
#   |          0            0            1     |

Rz = Matrix(Rz)
Rz[0,0] = cos(thetaz)
Rz[0,1] = -sin(thetaz)
Rz[0,2] = 0
Rz[1,0] = sin(thetaz)
Rz[1,1] = cos(thetaz)
Rz[1,2] = 0
Rz[2,0] = 0
Rz[2,1] = 0
Rz[2,2] = 1

# Generating the rotation matric
R = Rz*Ry*Rx

# Generating the linear translation
# Symbolic 3D line function
Translation = MatrixSymbol('Tl',3,1)
Translation = Start_pos + k * (End_pos-Start_pos)

# Integrate it into the transformation matric
#   |    R      T    |
#   |   000     1    |
T = Matrix(T)

i=0
for r in range(4):
for c in range(4):
if (c < 3 and r < 3):
T[r,c] = R[r,c]
elif (c == 3 and r < 3):
T[r,c] = Translation[i]
++i
elif (c < 3 and r == 3):
T[r,c] = 0
else:
T[r,c] = 1

## Save the created matrics with symbolic variables into global object
T = T.subs([(thetax,0),(thetaz,0)])
return T

if __name__ == "__main__":
main()

1

Решение

Здесь есть несколько ошибок:

  1. Функция Python generate_symbolic_transformation выдает исключение, которое делает resultObj быть NULL, Это распространяется дальше и приводит к краху.

  2. Даже если resultObj не было NULL, он не был бы должным образом возвращен вызывающему, так как последние две строки CallPlugIn_generate_symbolic_transformation убедитесь, что значение возвращается только в том случае, если оно NULL,

Но это конкретные проблемы. Я также хотел бы сделать несколько общих рекомендаций, которые могут помочь вам выявить проблемы на ранней стадии, сэкономив время и усилия:

  1. Обрабатывать ошибки Python. Как минимум, если функция Python C / API возвращает NULL, распечатайте ошибку. Например:


if (!resultObj)
{
PyErr_Print();
}

Это привело бы к сообщению об ошибке, похожему на:

Traceback (последний вызов был последним): файл
«/home/sterin/ClionProjects/numpy1/numpy_test.py», строка 15, в
generate_symbolic_transformation
T = T.subs ([(thetax, 0), (thetaz, 0)]) NameError: глобальное имя «thetax» не определено

Помочь вам поймать ошибку гораздо раньше.

  1. Убедитесь, что нет NULL значения представлены как PyObject* аргументы к вызовам Python C / API (если специально не разрешено). Это поймало бы место, где NULL результат был использован.
1

Другие решения


По вопросам рекламы [email protected]