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