2012-06-07 75 views
39

未来人们阅读本书的一些背景知识(如果未锁定)。我倾向于用高级语言编程来首先理解问题。在覆盖所有可能的角落案例之后,我继续将代码翻译成C++(或C)。Matlab编码器vs手编码?

我写的大部分代码都有数学,所以MATLAB是我使用的语言(对我来说Python的替代方案)。无论如何,我随后将代码从MATLAB转换为C++。

有谁知道使用MATLAB编码器是否有优势/劣势?这是一款新产品,非常昂贵,但除了在翻译过程中节省时间还有其他好处吗?

+7

为什么不直接下载MATLAB Coder试用版,看看它是如何工作的,并将结果与​​以前的工作进行比较? – mpontes

+0

如何使用高级语言工作,但仍然立即编译为快速本机代码? Haskell相当不错。 C++ 11也不算太坏。 – leftaroundabout

+0

的确,但是Matlab有很多内置的功能非常方便。 – s5s

回答

40

免责声明

这是基于我的expirience一个特定的项目非常自以为是的帖子。我没有使用最新版本的编码器,但是我已经具有用于将matlab代码转换为C++的同等产品(嵌入编码器)的经验,该C++包含在前Real Time Workshop产品中。这些评论仍然适用。你的旅费可能会改变。

早期待遇

在我的情况,使用嵌入式编码器,以使该融入一个更大的音频应用程序的一部分的处理块。处理模块具有实时处理样品缓冲液的恒定流的工作。我在matlab中创建了原始算法,并且转换工具使得将早期原型转换为可以编译为本地代码并用于实时应用程序的相当简单。假设转换后的代码在数据上与原始数据完全相同,而且在转换过程中没有人为错误(假设Mahworks工程师具有超人能力),这也很好。

好处这个非常早期的原型阶段结束后...

问题1:浪费时间接口

由于算法的复杂性的增长,我开始担心越来越多的关于如何编写代码的matlab接口的功能,使转换后,它很容易与C++框架接口(我想实时监控内部状态)。这最终开始使用尽可能多的时间作为实际的算法开发本身,从而破坏了使用这种工具的目的。我可以将算法分解成更小的块,然后使用C++将它们粘在一起,但是我没有能力直接完成Matlab的Matlab算法。

问题2:不是所有的功能被支持或不支持完全

编码器支持一个subset of the Matlab language。在某些情况下,支持的功能在某些方面受到限制。例如,在我正在开发的应用程序中,我希望能够实时修改过滤器的特征。我无法使用标准的Matlab滤波器原型功能,因为代码生成工具不允许使用可变参数调用滤波器原型功能。尽管我们拥有信号处理工具箱许可证,但我最终还是花费了时间与DSP书开发自己的实现。

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

我很沮丧与所述接口的问题和编码用手算法在C++中。对于我的应用程序,手写代码优于转换后的代码的性能提高了75%。性能差异会根据您的应用程序,可能使用的转换工具的版本以及您对分析器的喜好而有很大差异。转换工具本身是一个复杂的产品,有许多设置可供学习。试图找出如何调整设置和matlab代码以提高性能,可能会花费更多时间进行手动编码。

我没用过,因为转换工具...

我现在比较喜欢测试 - 辅助方法。我在Matlab中编写了一个原型,并进行了调整,直到我确信它的行为也符合我的要求。然后我用C++思考,并以对该语言更自然的方式重新编码算法。然后,我制作一个mex文件,与我的C++代码进行交互,以便我可以对照我的可信matlab等价物进行测试。对于我工作的问题空间,这是一种更高效(人力和机器)的方式来完成任务。

总之,这只是一个用户的意见。也许(正如您在原始帖子中发表的评论中所建议的那样),您应该注册试用版,以了解您的相处方式。然而,如果你是一个C++忍者,通过构建mex文件进行测试并不需要昂贵的附加产品许可证,它会让你成为一个更好的开发者。

+1

您称之为“测试辅助”是标准做法。保留原始的matlab代码进行非回归测试,并且您拥有一个高效且高效的工作流程。 –

2

如果你在MATLAB中编写起来比较容易,那么这个值将在很大程度上取决于你对时间的重视程度。

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

+0

我不认为他问是否值得从MATLAB转换到C,但最好的方法是什么。 – bakalolo

0

优势:

  1. 很多复杂的数学函数可用。
  2. 对于硬核数学编程相关。

缺点:

  1. 这是与其他现代语言,如C#,使用Java,Python相比并不流行。你的名字。
  2. 既然你编码的matlab,你往往主要集中在解决复杂的数学问题。另一种语言在各种任务中使用的绘图,网络开发和数学,以及(它没有丰富的数学函数,像MATLAB肯定)

我知道另外一个好处:因为它是技术编程优化,你可能在此领域编写应用程序时性能更好。性能非常可靠,看看这个问题,它提供了some helpful information

0

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

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

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

对于一个大项目,有时候MATLAB会崩溃,纠正,有时会挂起来,stateflow中的仿真就像一个sh * t。

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

0

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