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

Gre*_*age 4 c matlab mex matlab-coder

有关

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

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

Rya*_*ton 6

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

相似

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

一些基本的差异

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

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

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

决定时要考虑的因素

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