Matlab Coder对手编码?

时间:2012-06-07 22:21:42

标签: c++ c matlab matlab-deployment

将来阅读此内容的一些背景(如果它未被锁定)。我倾向于用高级语言编程以首先理解问题。在涵盖所有可能的极端情况后,我继续将代码转换为C ++(或C)。

我编写的大部分代码都包含数学,因此MATLAB是我使用的语言(我的替代方案是Python)。无论如何,我随后将代码从MATLAB翻译成C ++。

有没有人知道使用MATLAB Coder是否有任何优势/劣势?这是一种新产品而且非常昂贵,但除了节省翻译时还有其他好处吗?

6 个答案:

答案 0 :(得分:42)

<强>声明

这是一篇非常自以为是的帖子,基于我对一个特定项目的经验。我没有使用最新版本的编码器,但是我确实已经将等效产品(嵌入式编码器)用于将matlab代码转换为C ++,这是前Real Time Workshop产品的一部分。这些评论仍然适用。您的里程可能会有所不同。

早期福利......

在我的情况下,嵌入式编码器用于制作适合大型音频应用程序一部分的处理块。处理块的作用是实时处理恒定的样本缓冲流。我在matlab中创建了原始算法,转换工具使得将早期原型转换为可以编译为本机代码并在实时应用程序中使用的东西变得相当简单。我们也很高兴地认为转换后的代码在数字上与原始代码完全相同,而且在转换过程中没有人为错误(假设Mahworks工程师具有超人的能力)。

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

问题1:浪费时间接口

随着算法复杂性的增加,我开始越来越担心如何将matlab接口编码到函数中,以便在转换后很容易与C ++框架接口(我想监视内部状态)即时的)。这最终开始使用与实际算法开发本身一样多的时间,从而破坏了使用这种工具的目的。我可以将算法分解成更小的块,然后使用C ++将它们粘合在一起,但是我放弃了对完整算法进行直接Matlab比较的能力。

问题2:并非所有功能都得到完全支持或支持

编码员支持subset of the Matlab language。在某些情况下,支持的功能在某种程度上受到限制。例如,在我正在处理的应用程序中,我希望能够实时修改过滤器的特性。我无法使用标准的Matlab过滤器原型设计功能,因为代码生成工具不允许使用可变参数调用过滤器原型设计函数。即使我们有信号处理工具箱许可证,我最终也花时间编写了一本开发自己实现的DSP书籍。

问题3:自动生成的代码效率低下

我对界面问题感到沮丧,并在C ++中手动编码算法。对于我的应用程序,手动编写的代码比转换后的代码有75%的性能提升。性能差异将根据您的应用程序,可能是所使用的转换工具的版本以及您对分析器的喜好而有很大差异。转换工具本身是一个复杂的产品,有许多设置需要学习。试图弄清楚如何调整设置和matlab代码来提高性能会花费更多的时间用于手工编码。

我没有使用转换工具,因为......

我现在更喜欢更多的测试 - 辅助方法。我在Matlab中编写原型并进行调整,直到我确信它的行为也符合我的要求。然后我在C ++中思考并以一种对该语言更自然的方式重新编码算法。然后我创建一个与我的C ++代码接口的mex文件,以便我可以根据我信任的matlab等效项进行测试。对于我工作的问题空间,这是一种更有效(人和机器)的方式来完成工作。

总之,这只是一个用户的意见。也许(正如您对原始帖子的评论中所示),您应该报名参加试用,看看您是如何相处的。但是,如果你是一个C ++忍者,通过构建mex文件进行测试不需要昂贵的附加产品许可证,它将使你成为更好的开发人员。

答案 1 :(得分:2)

如果您更容易在MATLAB中编写,那么该值将在很大程度上取决于您对时间的重视程度。

比较MATLAB和C或C ++的性能非常复杂。在大多数情况下,C或C ++会更快,但在某些线性代数应用程序中,MATLAB可能会以最快的速度执行。我记得有一位教授声称他的FORTRAN应用程序比MATLAB中的等效应用程序慢。有很多关于此的案例研究 - 我建议你看一下不同的研究,比较谷歌出现的速度,并将它们与你做出决定的事情进行比较。

答案 2 :(得分:1)

这与整个过程有关。

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

诀窍(IMHO)是尽您所能尽最大可能实现流程自动化。这样做,您可以开发非常复杂的模型,并在几个小时内创建用于生产的C代码。您可以随意更新模型,但是代码易于维护。

缺点是设置此过程既不琐事也不是完全通用的(一种尺寸最不适合)。

此外,您实际上应该进行一些测试,以验证所生成的代码确实代表了您所拥有的模型。这不能保证,虽然我认为Matlab Coder相当可靠,但它并非没有错误。

答案 3 :(得分:0)

优势:

  1. 有许多复杂的数学函数可供使用。
  2. 与硬核数学编程有关。
  3. 缺点:

    1. 与C#,java,python等其他现代语言相比,它并不受欢迎。你说的名字。
    2. 由于您编写了matlab代码,因此您倾向于主要关注复杂的数学问题求解。另外一些语言也用于绘图,网页开发和数学等各种任务(它没有像matlab那样丰富的数学函数)
    3. 我所知道的另一个好处:由于它针对技术编程进行了优化,因此在此字段上编写应用程序时可能会有更好的性能。性能非常可靠,看看这个问题,它提供了some helpful information

答案 4 :(得分:0)

我认为MATLAB比普通的C编码有很多限制。我同意有很多内置块可以直接使用,但是如果你在MATLAB中编写代码,那么与C代码相比,它将花费近5倍的时间,因为从定义变量到采用循环,切换情况,它非常耗时在MATLAB建模中

假设你已经使用Simulink创建了一个模型,但是当你尝试添加一些东西时,它又非常耗时,但在C中只需要2分钟的任务。

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

对于一个大型项目,有时MATLAB会崩溃,纠正,有时会挂起,状态流中的模拟就像sh * t。

最后我只说一件事,即使你有很多耐心,使用MATLAB建模(stateflow + simulink)。

答案 5 :(得分:0)

如上所述,这取决于你的申请。我尝试转换解码器(通信系统),它提供了准确的结果,但是对于大量的位,它比它自己的MATLAB版本慢。所以我的结论是手工将MATLAB代码转换为C.