技术文章和新闻稿

从MATLAB生成C代码的乐趣

周国伟


工程师几十年来使用编译器将低级语言翻译为机器代码。但是是否有可能像Matlab一样翻译高级语言®使用编码程序编写C语言?大多数工程师都会同意这在理论上是可能的,但它在实践中有效吗?生成的代码是可读的还是通心粉?高效还是臃肿?快还是慢?它支持工业工作流程,还是仅仅支持研发?金宝app

本文正面讨论了这些问题。它提供了使用MATLAB编码器的技巧和最佳实践™, 以及Delphi、Baker Hughes、iSonea和dorsaVi等公司成功应用生成代码的行业示例。

本文中的代码示例可供选择下载。

MATLAB与C代码的比较:一个乘法示例

简单的MATLAB功能乘以两个输入。

给定标量输入,MATLAB编码器生成以下C代码:

如您所见,生成的代码清晰地映射回MATLAB代码。

同一部门的MATLAB代码,当给定两个矩阵输入时,会生成三个嵌套对于- 在c中的leoops:

推荐三步迭代工作流程

上面显示的简单功能可以在一个步骤中实现。但对于更重要的项目,我们建议使用三步迭代工作流的结构化方法(图1):

  1. 准备代码生成算法。检查和修改MATLAB代码以介绍低级C代码所需的实施考虑因素,并使用MATLAB支持的语言和功能金宝app代码生成。
  2. 使用默认设置测试MATLAB代码是否准备好生成代码。通过生成并执行MEX文件检查运行时错误。如果成功,请转至下一步。如果没有,请重复步骤1,直到可以生成MEX函数。
  3. 从步骤2生成C代码或保留MEX功能。您可以在MATLAB代码上迭代,以优化生成的C代码(视图和感觉,内存和速度)或MEX功能(用于性能)。
图1.生成代码的三步迭代工作流。

MATLAB编码器应用程序通过此迭代过程指导您,同时使您能够留在MATLAB环境中。它分析了MATLAB代码,为输入提出数据类型和尺寸。它通过生成MEX函数,测试您的MATLAB代码是否已准备好代码生成,然后执行MEX函数以检查运行时错误(图2)。等效命令行函数提供相同的功能,因此您可以生成代码作为脚本或函数的一部分。

图2.左:代码生成不支持的功能和功能的自动检查。金宝app右:输入数据类型和大小的自动分析和提案。

下面的视频用生成卡尔曼滤波器的示例来示出这些步骤以预测弹跳球的轨迹。您可以看到三步迭代过程使我们能够生成与原始MATLAB结果密切匹配并满足其跟踪要求的代码。

实施约束

当您为代码生成准备MATLAB算法时,您需要考虑由MATLAB和C代码之间的差异产生的实现约束。这些包括:

  • 内存分配。在MATLAB中,内存分配是自动的。在C代码中,内存分配是手动 - 它在静态分配(使用静止的),动态地(使用Malloc.)或堆叠(使用局部变量)。
  • 阵列的语言。MATLAB提供丰富的阵列操作集,允许简洁地编码数值算法。C代码需要显式对于-循环来表示相同的算法。
  • 动态打字。MATLAB自动确定代码运行时的数据类型和大小。C需要关于所有变量和函数的显式类型声明。
  • 多态性。MATLAB函数可以支持多种不同的输入类型,而C需要固定的类型金宝app声明。在顶层,您必须指定预期的C函数声明。

让我们仔细看看多态性。多态性可以根据您的输入提供单行MATLAB代码不同的含义。例如,图3中所示的功能可以指标量乘法,点产品或矩阵乘法。此外,您的输入可能是不同的数据类型(逻辑,整数,浮点,固定点),它们可能是真实的或复杂的数字。

图3.多态性示例。

Matlab是一种强大的算法开发环境,因为您不需要担心创建算法时的实现细节。但是,对于等效的C代码,您必须指定操作的意思。例如,上面显示的MATLAB代码的行可以转换为返回B * C的单行C代码:

或者,它可以转换为11行C代码,3对于-两个矩阵相乘的循环:

下面的视频使用牛顿-Raphson算法来说明考虑到实施限制的概念。您将看到使用三步迭代工作流生成的代码与原始MATLAB结果完全匹配。

使用生成的代码:四个用例

一旦您使用MATLAB编码器从MATLAB算法生成了可读和可移植的C/C++代码,您就可以使用它了。例如,您可以:

行业成功案例

  • 贝克休斯动力与遥测集团从序列预测算法生成DLL,并将其集成到运行在PC上的地面解码软件中,从而在钻井作业期间快速可靠地解码井下数据。
  • 多萨维从运动分析算法生成的C ++代码并将其编译为DLL,然后将其集成到PC上运行的C#应用​​程序,分析运动员的诊断伤害。

  • 百万南从心律监测算法生成定点C代码,并为ARM Cortex-M处理器编译。
  • 德尔菲为汽车雷达传感器校准算法生成C代码,并为ARM10处理器编译。
  • 呼吸从声学呼吸监测算法生成C代码,并为iPhone应用程序、Android应用程序和基于云的服务器软件进行编译。

多核代码生成和其他优化方法

在MATLAB中,对于- 只能通过更换并行地运行其迭代彼此独立的对于帕弗.MATLAB编码器使用打开的多处理(OpenMP)应用程序接口来支持共享内存,来自MultiCore代码生成金宝app帕弗循环。OpenMP由许多C金宝app编译器支持(例如,Microsoft®Visual Studio®专业的)。

可以将MATLAB编码器与嵌入式编码器结合使用®进一步优化代码效率并自定义生成的代码。嵌入式编码器为生成的代码的函数、文件和数据的细粒度控制提供了优化。例如,您可以使用存储类在生成的代码中控制全局变量的声明和定义,并使用代码生成模板自定义生成代码中的横幅和注释。嵌入式编码器还通过使用代码替换库来提高代码效率,代码替换库使用针对流行处理器(如arm cortex.®-一种ARM Cortex-M.

测试生成的代码

当您开发MATLAB算法时,您可以创建单元测试以验证算法是否会产生您期望的结果。使用的测试MATLAB单元测试框架可以重复使用,以验证生成的代码与MATLAB算法的行为方式相同。下面的视频展示了如何将嵌入式编码器中的单元测试与生成的独立代码或库上的软件在环(SIL)和处理器在环(PIL)测试结合使用(图4)。

自动化的工作流程

MATLAB编码器使自动工作流程将MATLAB算法转换为C代码。使用此工作流程,您花费更少的时间写作和调试低级C代码以及更多时间开发,测试和调整设计。通过在MATLAB中维护一个金色的参考,包括算法和测试台,您可以更快地将算法更改传播到C代码。像MATLAB单元测试框架等自动化工具和嵌入式编码器SIL和PIL测试框架允许您彻底和系统地测试MATLAB代码和C代码。无论您是在运行运行的设计传统电脑,Web服务器,移动设备嵌入式处理器,MATLAB Coder将帮助您更快地从MATLAB转换为C代码,并减少手动翻译错误。

2016年出版-92987v00