Matlab编码器vs手编码?
一些背景的人阅读这个在未来(如果它没有被locking)。 我倾向于使用高级语言编程来首先理解问题。 覆盖所有可能的angular落案例后,我继续将代码翻译成C ++(或C)。
我写的大部分代码都有math,所以MATLAB是我使用的语言(对我来说Python的替代scheme)。 无论如何,我手动将代码从MATLAB转换为C ++。
有谁知道使用MATLAB编码器是否有优势/劣势? 这是一个新的产品,非常昂贵,但除了节省翻译时间还有其他好处吗?
放弃
这是一个非常有见地的post,根据我对一个特定项目的看法。 我没有使用最新版本的编码器,但是我已经有了用于将matlab代码转换为C ++的同等产品(embedded编码器)的经验,该C ++包含在以前的Real Time Workshop产品中。 这些评论仍然适用。 你的旅费可能会改变。
早期的好处…
在我的情况下,embedded式编码器被用来制作一个处理块,以适应更大的audio应用程序的一部分。 处理块具有实时处理样品缓冲液的恒定stream的工作。 我在matlab中创build了原始algorithm,转换工具使得将早期原型转换成可以编译为本地代码并用于实时应用程序的原型变得非常简单。 假设转换后的代码在转换过程中(假设Mahworks工程师的超人能力)在原始数据上没有发生人为错误的可能性,这也是很好的。
在这个非常早期的原型阶段之后,好处就结束了。
问题1:浪费时间接口
随着algorithm复杂性的增加,我开始越来越担心如何将matlab接口编码到函数中,以便在转换之后,很容易与C ++框架进行交互(我想实时监视内部状态) 。 这最终开始使用与实际algorithm开发本身一样多的时间,从而破坏了使用这种工具的目的。 我可以将algorithm分解成更小的块,然后使用C ++将它们粘在一起,但是我没有能力直接完成Matlab的Matlabalgorithm。
问题2:并不是所有的function都得到完全支持或支持
编码器支持Matlab语言的一个子集 。 在某些情况下,支持的function在某种程度上受到限制。 例如,在我正在开发的应用程序中,我希望能够实时修改filter的特性。 我不能使用标准的Matlab滤波器原型function,因为代码生成工具不允许调用具有可变参数的滤波器原型function。 尽pipe我们拥有信号处理工具箱许可证,但我最终还是花费了一些时间来开发自己的DSP实现。
问题3:自动生成的代码效率低下
我对界面问题感到沮丧,并用C ++手工编写algorithm。 对于我的应用程序来说,手写代码优于转换后的代码有75%的性能提升。 性能差异将根据您的应用程序,可能使用的转换工具的版本以及您的分析器的喜好而大不相同。 转换工具本身是一个复杂的产品,有许多设置要学习。 试图找出如何调整设置和提高性能的matlab代码使用更多的时间,可以花手编码。
我没有使用转换工具,因为…
我现在更喜欢更多的testing辅助方法。 我在Matlab中编写一个原型,并调整,直到我确定它的行为也是我想要的。 然后我用C ++思考,并以对该语言更自然的方式重新编码algorithm。 然后,我做一个mex文件,与我的C ++代码接口,以便我可以testing它对我的可信matlab等效。 对于我工作的问题空间,这是一个更有效(人和机器)的方式来完成的东西。
总之,这只是一个用户的意见。 也许(正如您在原帖中评论的那样),您应该报名参加试验,看看您是如何相处的。 然而,如果你是一个C ++忍者,通过构buildmex文件进行testing并不需要昂贵的许可证,这会使你成为一个更好的开发者。
如果你用MATLAB编写起来更容易,那么这个值将在很大程度上取决于你多less时间。
比较MATLAB和C或C ++的性能是非常复杂的。 在大多数情况下,C或C ++的速度会更快,但是在一些线性代数应用中,MATLAB可能会执行得最快。 我记得有一位教授声称他有FORTRAN的应用程序运行速度比MATLAB等同。 有很多这方面的案例研究 – 我build议你看看不同的研究,比较谷歌的速度,并将它们与你正在做的决定进行比较。
优点:
- 许多复杂的math函数是可用的。
- 对于硬核math编程有关。
坏处:
- 与其他现代语言(如C#,java,python)相比,它并不stream行。 你把它命名。
- 由于你编码matlab,你往往主要集中在解决复杂的math问题。 另一种语言被用于从绘图,网页开发和math的各种任务(它确实没有像matlab这样丰富的math函数)
我知道的另一个好处是:由于它是针对技术编程进行优化的,所以在这个领域编写应用程序时可能会有更好的性能 性能非常可靠,看看这个问题,它提供了一些有用的信息 。
我认为MATLAB对正常的C编码有很多限制。 我同意有这么多的内置块可以直接使用,但如果你在MATLAB中编写代码,那么与C代码相比,它将花费近5倍的时间,因为从定义variables到循环,切换情况,非常耗时在MATLABbuild模中
假设你使用Simulink做了一个模型,但是当你尝试再添加一些东西时,这是非常耗时的,但是在C中它只是2分钟的任务。
接下来的问题是,你不能像其他编程语言那样注释掉任何模型。
对于一个大项目,有时候MATLAB会崩溃,纠正,有时会挂起来,stateflow中的仿真就像是sh * t。
最后,我只说一件事,那就是只有在你有足够的耐心的时候才使用MATLABbuild模(stateflow + simulink)。
如上所述,这取决于你的应用程序。 我试图转换解码器(通信系统)它给出了准确的结果,但是对于大量的比特,它比它自己的MATLAB版本慢。 所以我的结论是手动将MATLAB代码转换为C.