我的目标是使用C代码和Matlab代码的混合,并最终通过使用Coder工具在C中运行整个事物。 我找到了两种方法将C合并到Matlab中,编写一个Mex文件,并在C程序中使用coder.ceval。
除了调用语法之外,这两种方法有什么不同吗?
答案 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文件)
mxArray
值和本机C类型之间手动移动数据。您需要使用MEX library和C/C++ Matrix Library来执行此操作。如果使用coder.ceval
,则可以从您的MATLAB代码自动生成MEX文件,为您执行此数据编组。double
和single
值,则必须为每种输入类型生成一个MEX文件。mxArray
值中检索数据,就可以编写任意C代码来操作它。 coder.ceval
要求您编写MATLAB Coder兼容的MATLAB代码,以使用它提供的外部代码接口调用C函数。对于具有简单接口的功能,例如那些采用数字数组,字符串等的人,这很简单。对于那些采用其他数据类型的人,必须使用更高级的工具,如coder.opaque
,coder.cstructname
和自定义enumeration definitions,这可能需要一些时间。需要权衡为MATLAB Coder开发此接口的成本与学习和使用第一个项目中提到的MATLAB库的成本。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开发环境生成代码之后与生成的代码集成。
coder.ceval
集成外部C代码比编写将其公开给MATLAB的MEX文件更容易或更难,然后将MATLAB Coder生成的代码与MEX文件下的计算内核集成在一起吗?