Matlab Coder和手写代码哪个更好?

45

针对未来阅读此内容的人(如果它没有被锁定),提供一些背景信息。我通常会使用高级语言编写程序来先了解问题。在涵盖所有可能的边界情况后,我会将代码转换为C++(或C)。

我编写的大部分代码都涉及数学,所以我使用MATLAB语言(另一个选择是Python)。然后,我通过手工将代码从MATLAB翻译成C++。

请问是否有任何优缺点使用MATLAB Coder?这是一个新产品,非常昂贵,但除了节省翻译时间外,还有其他好处吗?


7
为什么不下载 MATLAB Coder 试用版,看看它适合你的工作方式,并将结果与之前做过的工作进行比较呢? - mpontes
1
使用一种高级语言,既易于编写,又可以立即编译成快速的本地代码,怎么样?Haskell非常不错。C++11现在也不错。 - leftaroundabout
没错,但Matlab有很多内置函数非常方便。 - s5s
你能翻译使用内置函数和/或工具箱的Matlab代码的程度有多大?我知道有相当多的限制。 - cs0815
1
如果选择手写编码路线,C++库/工具包(例如Armadillo)可能非常有用。 - mtall
6个回答

49

免责声明

本文是基于我在一个特定项目中的经验而得出的非常主观的观点。我没有使用最新版本的编码器,但我有使用过相当的产品(嵌入式编码器),用于将Matlab代码转换为C ++,该产品作为前Real Time Workshop产品的一部分包含在内。这些评论仍然适用。您的实际情况可能会有所不同。

早期优点...

在我的情况下,嵌入式编码器用于制作适合于更大音频应用程序一部分的处理块。处理块的工作是实时处理恒定流的样本缓冲区。我最初在Matlab中制作了原始算法,转换工具使得将早期原型转换为可以编译成本地代码并用于实时应用程序变得相当简单。还很好地假设转换后的代码在数值上与原始代码完全相同,没有人为错误的可能性在转换过程中(假设Mahworks工程师具有超人类的能力)。

这些好处在非常早期的原型制作阶段之后就结束了...

问题1:浪费时间进行接口设计。

随着算法复杂度的增加,我越来越担心如何编写Matlab接口,以便在转换后,易于与C++框架进行接口(我想实时监视内部状态)。这最终开始花费与算法开发本身同样多的时间,因此打败了使用这种工具的目的。我本可以将算法分解为较小的块,然后使用C++将它们粘合在一起,但那样我将失去仅使用Matlab对完整算法进行直接比较的能力。
问题2:不是所有的函数都被支持或完全支持
编码器支持Matlab语言的子集。在某些情况下,受支持的函数在某些方面受到限制。例如,在我正在处理的应用程序中,我希望能够实时修改滤波器的特性。我无法使用标准的Matlab滤波器原型函数,因为代码生成工具不允许使用可变参数调用滤波器原型函数。最终,尽管我们有信号处理工具箱许可证,我还是花时间阅读DSP书籍,开发了自己的实现。
问题3:自动生成的代码效率低下。
我因界面问题感到沮丧,用C++手写编码算法。对于我的应用程序,手写代码的性能优势达到了75%。不同应用程序的性能差异将非常不同,这可能取决于使用的转换工具版本和您对分析器的喜好。转换工具本身是一个复杂的产品,有很多设置需要学习。尝试调整设置和Matlab代码以提高性能的时间比手动编码更多。
我自那以后再也没有使用过转换工具...
我现在更喜欢一种更加测试辅助的方法。我先在Matlab中编写原型,不断调整直到确定其表现符合我的期望。然后我会考虑C++并以更符合该语言的方式重新编写算法。接下来,我制作一个mex文件,与我的C++代码进行交互,以便与我信任的Matlab等效代码进行测试。对于我工作的问题领域,这是一种更有效(人和机器)的完成任务的方式。
总之,这只是一个用户的观点。也许(正如您在原帖评论中所建议的),您应该注册试用版以了解您的情况。然而,如果您是C++忍者,通过构建mex文件进行测试不需要昂贵的附加产品许可证,并且这将使您成为更好的开发人员。

1
“Test-assisted” 正如你所说是标准做法。保留原始的 Matlab 代码进行非回归测试,这样你就拥有了一个良好高效的工作流程。 - Alexandre C.
自动生成的代码效率低下,你还记得生成代码中的性能问题是什么吗? - yugr
@yugr 绝对不是近十年的时间,即使我能记得,它们在今天的任何产品中也可能已经不再相关。 - learnvst

2

如果您更喜欢使用MATLAB编写,那么价值很大程度上取决于您如何评估自己的时间价值。

将MATLAB与C或C ++进行性能比较非常复杂。在大多数情况下,C或C ++速度会更快,但在某些线性代数应用中,MATLAB可能会执行得最快。我记得有位教授声称他的FORTRAN应用程序比等效的MATLAB应用程序运行得更慢。有许多案例研究 - 我建议您查看谷歌上出现的不同研究并将其与您正在进行的工作进行比较,以做出决策。


我认为他问的不是是否值得从MATLAB转换到C,而是最佳方法是什么。 - Lightsout

2

一切都在于流程。

在我的工作中,我们为Simulink模型及其依赖关系开发了一个良好的管理方案。然后我编写了一个脚本来执行自动编码步骤,一位同事在IDE中开发了项目文件,这样在运行我的脚本时,所有源文件都会被分派到适当的文件夹结构中,并且该项目可以在IDE中轻松编译,其中另外一位同事还部署了一个包装器代码以与自动编码软件进行接口。

窍门(在我看来)是尽早尽可能地自动化您的流程。通过这样做,您可以开发非常复杂的模型,然后在几个小时内为生产创建C代码。您可以随意更新模型,但代码仍易于维护。

缺点是设置此流程既不是微不足道的,也不是完全通用的(一种尺寸并不适合所有人)。

此外,您真的应该设置一些测试来验证生成的代码确实代表您拥有的模型。这并不保证,虽然我认为Matlab Coder非常可靠,但它并不是无误的。


0

正如上面所说,这取决于您的应用程序。我尝试转换解码器(一个通信系统的解码器),它可以给出准确的结果,但对于大量比特来说,它要比自己的 MATLAB 版本慢。因此,我的结论是手动将 MATLAB 代码转换为 C。


-1

我认为MATLAB在普通的C编码方面有很多限制。我同意它有许多内置块可以直接使用,但如果你在MATLAB中编写代码,与C代码相比,它将需要近5倍的时间,因为从定义变量到循环、开关语句,这些在MATLAB建模中非常耗时。

假设你使用Simulink制作了一个模型,但当你尝试添加一些东西时,再次非常耗时,但在C中只需2分钟即可完成。

下一个问题是,你不能像其他编程语言那样注释掉任何模型片段。

对于一个大项目,有时MATLAB会崩溃、损坏,有时在stateflow中进行仿真就像在做狗屎。

最后我只想说一件事,只有当你有足够的耐心时,才使用MATLAB建模(stateflow+simulink)。


-1

优点:

  1. 提供了许多复杂的数学函数。
  2. 适用于专业的数学编程。

缺点:

  1. 与其他现代语言如C#,Java和Python等相比,它不太流行。
  2. 由于你编写Matlab代码,你往往更加关注解决复杂的数学问题。而其他语言也被用于绘图、Web开发和数学等各种任务(当然没有像Matlab那样丰富的数学函数)。

我知道的另一个好处是:由于它针对技术编程进行了优化,因此在编写这个领域的应用程序时,您可能会获得更好的性能。性能非常可靠,请查看这个问题,它提供了一些有用的信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接