从Matlab生成C代码的快乐

由Mill Chou,Mathworks


工程师几十年来使用编译器将低级语言翻译为机器代码。但是是否有可能像Matlab一样翻译高级语言®到C使用编码器?大多数工程师都同意理论上是可能的 - 但它在实践中工作吗?是生成的代码可读或意大利面条吗?有效或臃肿?快或慢?它是否支持工业工作流程,万博1manbetx或者只是研发?

本文涉及这些问题的正面。它提供了与Matlab Coder™合作的提示和最佳实践,以及Delphi,Baker Hughes,Isonea和Dorsavi等公司的成功应用程序的业务示例。

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

比较MATLAB和C代码:乘法示例

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

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

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

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

推荐三步迭代工作流程

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

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

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

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

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

实施约束

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

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

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

图3.多态性示例。

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

或者,它可以转换为11行C代码,3为了- 将两个矩阵乘以两个矩阵:

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

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

一旦使用MATLAB编码器从MATLAB算法生成可读和便携式的C / C ++代码,您可以使用多种选项来使用它。例如,您可以:

行业成功案例

  • Baker Hughes'动态和遥测集团从序列预测算法生成DLL,并将其集成到PC上运行的表面解码软件,该软件在钻孔操作期间能够在钻井操作期间快速且可靠地解码井下数据。
  • 杜塞韦从运动分析算法生成的C ++代码并将其编译为DLL,然后将其集成到PC上运行的C#应用​​程序,分析运动员的诊断伤害。

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

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

在matlab,为了- 只能通过更换并行地运行其迭代彼此独立的为了议案。MATLAB编码器使用打开的多处理(OpenMP)应用程序接口来支持共享内存,来自MultiCore代码生成万博1manbetx议案循环。OpenMP由许多C万博1manbetx编译器支持(例如,Microsoft®视觉工作室®专业的)。

您可以使用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编码器将帮助您从Matlab到C代码更快,手动转换错误较少。

发布2016年 - 92987V00