mex文件和用coder.ceval调用的函数之间有什么区别吗?

时间:2015-07-27 23:39:06

标签: c matlab mex matlab-coder

related

我的目标是使用C代码和Matlab代码的混合,并最终通过使用Coder工具在C中运行整个事物。 我找到了两种方法将C合并到Matlab中,编写一个Mex文件,并在C程序中使用coder.ceval。

除了调用语法之外,这两种方法有什么不同吗?

1 个答案:

答案 0 :(得分:6)

我将比较使用MATLAB Coder创建手写MEX文件以使用coder.ceval集成自定义C代码。

的相似性

在这两种情况下,都可以生成一个MEX文件,您可以像在任何其他MATLAB函数中一样在MATLAB中调用它。将使用您编写的C源代码中的mex命令编译手写MEX函数。使用MATLAB Coder,MEX文件将自动从MATLAB代码生成,该代码使用coder.ceval命令或MATLAB Coder应用程序通过codegen调用C代码。

一些基本差异

(注意我全部使用C,但C ++也可以用于MEX文件)

  • 编写MEX文件时,需要在mxArray值和本机C类型之间手动移动数据。您需要使用MEX libraryC/C++ Matrix Library来执行此操作。如果使用coder.ceval,则可以从您的MATLAB代码自动生成MEX文件,为您执行此数据编组。
  • 可以使用单个手写MEX文件来处理各种MATLAB数据类型。 MATLAB Coder需要类型,大小(数组也可以variable-size),以及要声明的每个参数的复杂性。例如,如果您希望MEX文件对于给定输入采用doublesingle值,则必须为每种输入类型生成一个MEX文件。
  • 使用手写的MEX文件,一旦从MATLAB提供的mxArray值中检索数据,就可以编写任意C代码来操作它。 coder.ceval要求您编写MATLAB Coder兼容的MATLAB代码,以使用它提供的外部代码接口调用C函数。对于具有简单接口的功能,例如那些采用数字数组,字符串等的人,这很简单。对于那些采用其他数据类型的人,必须使用更高级的工具,如coder.opaquecoder.cstructname和自定义enumeration definitions,这可能需要一些时间。需要权衡为MATLAB Coder开发此接口的成本与学习和使用第一个项目中提到的MATLAB库的成本。
  • 如果您最终希望在MATLAB之外使用C语言中的代码,使用MATLAB Coder和coder.ceval,则可以简单地将目标从MEX更改为standalone target,如静态或动态库或可执行文件。使用手写的MEX文件,通常会考虑C代码,以便MEX接口mexFunction与C功能内核分开。然后,可以在MEX之外调用此内核。如果您计划使用MATLAB Coder,那么您必须以某种方式将MATLAB Coder代码与此内核集成。

如果代码最终与MATLAB Coder一起使用,当目标是MEX时使用Coder调用MEX文件需要使用coder.extrinsic。它们也不能在独立目标中直接调用。相反,MEX文件底层的C计算内核需要在使用coder.ceval生成代码期间或使用传统C开发环境生成代码之后与生成的代码集成。

决定时要考虑的因素

  1. 使用MATLAB Coder尽早集成C代码并自动生成MEX接口的好处是否超过了使用MATLAB Coder外部代码接口与手写MEX文件所需的工作?
  2. 使用coder.ceval集成外部C代码比编写将其公开给MATLAB的MEX文件更容易或更难,然后将MATLAB Coder生成的代码与MEX文件下的计算内核集成在一起吗?