Автоматическое дифференцирование кода, сгенерированного Matlab Coder

У меня есть функция Matlab, которая мне нужна 1) Ускорить 2) Генерировать производные функции с помощью автоматического дифференцирования (AD).

Ускорение процесса я выполнил, используя Matlab Coder для генерации кода C и функции mex. Теперь я ищу инструмент AD, который из коробки (или с незначительными изменениями кода) можно использовать для этого автоматически сгенерированного кода C. Кажется, есть много инструментов C/C++ AD, посмотрите инструменты C/C++ AD, и я протестировал пару для этой цели:

  • Tapenade: не работает с файлами, созданными Matlab Coder
  • ADOL-C: необходимо переписать функции C для некоторых конкретных типов данных (я думаю, что многие инструменты имеют такие требования)

У кого-нибудь есть опыт использования таких инструментов для кода, сгенерированного Matlab Coder?

PS. Инструмент AD должен работать в Windows.

1 ответ

Решение

Если у вас есть символический набор инструментов, вы можете использовать его для генерации аналитических производных. Предполагая, что у вас есть функция, такая как z = f(x,y), вы создаете символические переменные

x = sym('x', [mx,nx]); 
y = sym('y', [my,ny]);

где mx, nx, mx, my указывают размер входных переменных. Вызовите f, используя ваши символические переменные (например, z = f(x,y)).

Теперь вы можете создавать производные с помощью функции jacobian.

jac_z_x = jacobian(z,x(:));
jac_z_y = jacobian(z,y(:));

Запишите производные в файл Matlab, используя функцию Matlab. При необходимости вы можете скомпилировать функцию с MATLAB Coder. Вот как я делаю это для моих проблем оптимизации.

Надеюсь, это поможет Матиасу

Другие вопросы по тегам