45

将来阅读本文的人的一些背景知识(以防它未锁定)。我倾向于使用高级语言进行编程以首先理解问题。在涵盖了所有可能的极端情况之后,我继续将代码翻译成 C++(或 C)。

我编写的大部分代码都包含数学,所以 MATLAB 是我使用的语言(我的替代语言是 Python)。无论如何,然后我将代码从 MATLAB 手动翻译成 C++。

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

4

6 回答 6

47

免责声明

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

早期福利...

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

在这个非常早期的原型设计阶段之后,好处就结束了……

问题 1:浪费时间的接口

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

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

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

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

我对接口问题感到沮丧,并用 C++ 手工编写了算法。对于我的应用程序,手写代码比转换后的代码有 75% 的性能提升。根据您的应用程序、可能使用的转换工具的版本以及您对分析器的喜爱程度,性能差异会非常不同。转换工具本身是一个复杂的产品,需要学习许多设置。尝试弄清楚如何调整设置和 matlab 代码以提高性能会花费更多时间,而这些时间可能会花在手动编码上。

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

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

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

于 2012-06-07T23:52:21.510 回答
2

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

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

于 2012-06-07T22:48:07.643 回答
2

这都是关于过程的。

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

诀窍(恕我直言)是尽可能早地使您的流程自动化。通过这样做,您可以开发非常复杂的模型,然后在几个小时内创建用于生产的 C 代码。您可以随心所欲地更新模型,但代码易于维护。

缺点是设置这个过程既不简单也不完全通用(一种尺寸不适合大多数人)。

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

于 2019-01-25T17:15:41.613 回答
0

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

于 2016-09-29T16:34:00.167 回答
-1

优势:

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

坏处:

  1. 与 C#、java、python 等其他现代语言相比,它并不流行。你的名字。
  2. 由于您编写 matlab 代码,因此您往往主要专注于解决复杂的数学问题。另一种语言也用于绘图、Web 开发和数学等各种任务(它肯定没有像 matlab 这样丰富的数学函数)

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

于 2012-06-07T22:53:23.593 回答
-1

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

假设您已经使用 Simulink 创建了一个模型,但是当您再次尝试添加一些东西时,这非常耗时,但在 C 语言中这只是 2 分钟的任务。

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

对于一个大型项目,有时 MATLAB 会崩溃、出错,有时会挂起,并且在 stateflow 中进行仿真就像是一团糟。

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

于 2012-10-07T09:46:04.180 回答