使用 MATLAB 编码器将 MATLAB 转换为 C++

Posted

技术标签:

【中文标题】使用 MATLAB 编码器将 MATLAB 转换为 C++【英文标题】:Convert MATLAB to C++ using MATLAB coder 【发布时间】:2018-05-02 14:20:00 【问题描述】:

我要将“充满矩阵运算”的 MATLAB 代码转换为 C++,我不确定 MATLAB 编码器是否会生成高效的 C++ 代码。虽然它非常耗时,但手动转换是否更好?

【问题讨论】:

结合你的两种方法。使用 MATLAB 生成 C++,然后查看 C++ 以查看是否可以优化。您可能希望在转换之前优化 MATLAB 代码。 @ThomasMatthews 谢谢,还有一件事,MATLAB 编码器是使用犰狳库还是通过循环处理矩阵运算? 我不在 MATLAB 工作,也没有看过源代码。您必须进行转换才能验证。 我对 Simulink Coder 有更多的经验,但是在那个产品中生成的 C++ 代码与生成的 C 代码非常相似,并且它不依赖于任何类型的外部矩阵/线性代数库。我相信 MathWorks 投入了大量精力来制作高效的生成代码。 【参考方案1】:

正如其他人所说,使用 MATLAB Coder 生成代码,使用编译器的优化对其进行编译,然后进行测量是了解您的需求是否会得到满足的唯一方法。

MATLAB Coder 直接为大多数算法生成代码,无需使用外部库。在某些情况下,可能会使用库或用户可能会请求库。您可能特别感兴趣的是 BLAS 和 LAPACK 集成。

如果您将线性代数作为矩阵运算的一部分,请考虑配置 MATLAB Coder 以调用您选择的高性能 BLAS 和 LAPACK 库:

https://www.mathworks.com/help/coder/ug/speed-up-matrix-operations-in-generated-standalone-code-by-using-blas-calls.html

https://www.mathworks.com/help/coder/ug/generate-code-that-calls-lapack-functions.html

这将导致 MATLAB Coder 将其算法替换为调用您为线性代数运算(如 *, \, linsolve, lu, svd, eig 等)指定的库。

MATLAB Coder 提供了提高生成代码性能的建议:

https://www.mathworks.com/help/coder/optimize-speed-of-generated-code.html

在这种情况下,一种可能的方法是生成代码并使用分析器(如 prof、VTune、AMD Codeanalyst、Visual Studio 性能工具等)对其进行分析。如果您发现一些昂贵的内核可能无法生成代码满足您的性能需求,使用类似 C 的界面为这些部分手写替换,并使用 coder.ceval 将它们与您生成的代码集成。

【讨论】:

谢谢,这很有帮助。

以上是关于使用 MATLAB 编码器将 MATLAB 转换为 C++的主要内容,如果未能解决你的问题,请参考以下文章

将 MATLAB 代码转换为库

将 C 字符数组转换为 Matlab 字符串 [Matlab 编码器]

使用代码包将 Matlab 代码转换为 .mex

Matlab 编码器 fzero 函数

Matlab 编码器:Matlab 数组到 C 数组

在 Matlab 编码器中使用可变大小的参数