Matlab Coder生成的C代码的自动微分[关闭]

Posted

技术标签:

【中文标题】Matlab Coder生成的C代码的自动微分[关闭]【英文标题】:Automatic differentiation of Matlab Coder generated C code [closed] 【发布时间】:2015-09-03 08:49:31 【问题描述】:

我有一个需要的 Matlab 函数 1) 加速 2)通过自动微分(AD)生成函数的导数。

我通过使用 Matlab Coder 生成 C 代码和 mex 函数完成的加速部分。现在我正在寻找一个开箱即用(或进行少量代码修改)的 AD 工具,可用于自动生成的 C 代码。那里似乎有很多 C/C++ AD 工具,请参阅 C/C++ AD tools,为此我已经测试了几个:

Tapenade:不适用于 Matlab Coder 生成的文件 ADOL-C:需要将C函数重写为一些特定的数据类型(我认为很多工具都有这样的要求)

有没有人有使用 Matlab Coder 生成代码的这些工具的经验?

PS。 AD 工具应该可以在 Windows 上运行。

【问题讨论】:

首先需要使用 MATLAB 吗? MATLAB 代码可以很容易地移植到 Julia (julialang.org),如果使用得当,它可以获得类似 C 的速度,并且有几个可用的 AD 工具(例如 github.com/tshort/AutoDiff.jl) @tomas-lycken:Matlab 肯定是我的首选工具,但如果我不能在 Matlab 中使用它,我可能会按照你的建议去做。 一个问题,是你选择matlab的绘图吗?在这种情况下,您可以将数据写入文件,然后再绘制。我提出这个问题的原因是您似乎对您的程序有要求,这似乎需要大量采用才能工作。如果您需要将代码的主要部分转换为 c 代码,那么其他的可能会更容易。 @patrik:我的其余代码库在 Matlab 中,而上述函数所基于的数据是在 Matlab 中生成的。我只需要加速我的一小部分代码,这是优化问题的成本函数/约束。因此需要AD 【参考方案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(:));

使用 matlabFunction 将导数写入 matlab 文件。如果需要,您可以使用 MATLAB Coder 编译该函数。这就是我解决优化问题的方法。

希望这会有所帮助 马蒂亚斯

【讨论】:

感谢您的回答。实际上,我的问题太复杂了,无法正常工作。我通过使用 AdiMat 包解决了这个问题。但是,正如前面所述,您的解决方案是解决问题的好方法,我自己在较早的场合中使用过这个。我会将其标记为已接受的解决方案。 如果编写 matlab 函数需要很长时间,这是由于 matlab 会自动进行一些代码优化。从 MATLAB2015a 开始,您可以禁用该优化,从而允许您使用更复杂的函数。

以上是关于Matlab Coder生成的C代码的自动微分[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Studio 中添加 MATLAB CODER 生成的 C

如何给matlab coder装license

使用 Matlab Coder 生成算法进行生产

使用 Matlab Coder 将 C 字符数组转换为 Matlab 字符串

使用 Matlab Coder 将 Matlab m 文件转换为 C/C++ 代码,包括 mex 文件 (mxArray)

预期标量值:MATLAB Coder