В настоящее время я пытаюсь переместить некоторые из моих алгоритмов из Mathematica в sympy.В этом контексте я пытаюсь найти генератор c-кода в соответствии с пакетами mathematica:
, которые позволяют экспортировать символьные выражения в эффективный C-код, включая функции с векторным значением.Я искал в документации Sympy, но кажется, что codegen работает только со скалярными функциями.Мне нужен способ экспорта векторнозначных функций с вычислительной эффективностью в C.
Пример: Предположим, у меня есть 2-мерные векторы x и y и я хочу создать функцию, которая возвращает 2-мерный вектор:
out=[(x(0)+y(0))^2,x(0)+y(0)+y(1)] //MATLAB convention
Это должно быть экспортировано в C-функцию следующим образом:
void c_func (double* out, double *x, double *y){
tmp1=x[0]+y[0];
out[0]=tmp1*tmp1; //(x[0]+y[0])^2
out[1]=tmp1+y[1]; //x[0]+y[0]+y[1]
}
Однако до сих пор я могу экспортировать только скалярную функцию.Поэтому я застрял в следующих вопросах:
- Как использовать векторы в качестве аргументов функции
- Как использовать векторы в качестве аргументов возврата
- Как оптимально использовать математические операции(например, создание временной переменной tmp1 = (x + 1), которая повторно используется для out [0] и out [1]), что невозможно при последовательном экспорте каждого векторного элемента
Знаете ли вы,Как это реализовано в Sympy или у вас есть альтернативные решения?Большое спасибо заранее !!!!
Используемый в настоящее время код для экспорта скалярных выражений:
from sympy import*
from sympy.utilities.codegen import codegen
x1,x2 = symbols('x1 x2')
x=Matrix([x1,x2])
y1,y2 = symbols('y1 y2')
y=Matrix([y1,y2])
[(c_name, c_code), (h_name, c_header)] = codegen(("f", (x1+y2)**2), "C","myheader")
print(c_code)
[(c_name, c_code), (h_name, c_header)] = codegen(("f", (x1+y1+y2)), "C","")
print(c_code)
, который выдает:
******************************************************************************/
#include "myheader.h"
#include <math.h>
double f(double x1, double y2) {
return pow(x1 + y2, 2);
}
******************************************************************************/
#include ".h"
#include <math.h>
double f(double x1, double y1, double y2) {
return x1 + y1 + y2;
}