mex 文件和用 coder.ceval 调用的函数之间有什么区别吗?
Is there any difference between a mex file and a function called with coder.ceval?
我的目标是混合使用 C 代码和 Matlab 代码,并最终通过使用 Coder 工具在 C 中完成所有事情 运行。
我找到了两种将 C 合并到 Matlab、编写 Mex 文件和在 C 程序上使用 coder.ceval 的方法。
除了调用语法之外,这两种方法有什么区别吗?
我将比较创建手写 MEX 文件与使用 MATLAB Coder 集成自定义 C 代码 coder.ceval
。
相似之处
在这两种情况下,都可以生成一个 MEX 文件,您可以像调用任何其他 MATLAB 函数一样在 MATLAB 中调用该文件。将使用您编写的 C 源代码中的 mex
命令编译手写的 MEX 函数。使用 MATLAB Coder,MEX 文件将自动从 MATLAB 代码生成,该代码通过 coder.ceval
使用 codegen
命令或 MATLAB Coder App
调用您的 C 代码。
一些基本差异
(注意我一直使用 C,但 C++ 也可用于 MEX 文件)
- 编写 MEX 文件时,需要在
mxArray
值和本机 C 类型之间手动移动数据。您需要使用 MEX library and the C/C++ Matrix Library 来执行此操作。如果使用 coder.ceval
,可以从您的 MATLAB 代码自动生成 MEX 文件,为您执行此数据编组。
- 单个手写 MEX 文件可以处理多种 MATLAB 数据类型。 MATLAB Coder 需要声明每个参数的类型、大小(数组也可以variable-size)和复杂性。例如,如果您想要一个 MEX 文件对给定输入采用
double
和 single
值,则必须为每种输入类型生成一个 MEX 文件。
- 对于手写的 MEX 文件,一旦从 MATLAB 提供的
mxArray
值中检索到数据,就可以编写任意 C 代码来对其进行操作。 coder.ceval
要求您编写与 MATLAB Coder 兼容的 MATLAB 代码,以使用它提供的外部代码接口调用 C 函数。对于具有简单接口的功能,例如那些采用数字数组、字符串等的,这可能很简单。对于采用其他数据类型的那些,必须使用更高级的工具,如 coder.opaque
, coder.cstructname
and custom 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 开发环境生成代码之后与生成的代码集成。
决定时要考虑的因素
- 与手写 MEX 文件相比,使用 MATLAB Coder 尽早集成 C 代码并自动生成 MEX 接口的好处是否超过使用 MATLAB Coder 外部代码接口所需的工作?
- 使用
coder.ceval
集成外部 C 代码比编写将其公开给 MATLAB 的 MEX 文件然后将 MATLAB Coder 生成的代码与 MEX 文件下的计算内核集成相比更容易还是更难?
我的目标是混合使用 C 代码和 Matlab 代码,并最终通过使用 Coder 工具在 C 中完成所有事情 运行。 我找到了两种将 C 合并到 Matlab、编写 Mex 文件和在 C 程序上使用 coder.ceval 的方法。
除了调用语法之外,这两种方法有什么区别吗?
我将比较创建手写 MEX 文件与使用 MATLAB Coder 集成自定义 C 代码 coder.ceval
。
相似之处
在这两种情况下,都可以生成一个 MEX 文件,您可以像调用任何其他 MATLAB 函数一样在 MATLAB 中调用该文件。将使用您编写的 C 源代码中的 mex
命令编译手写的 MEX 函数。使用 MATLAB Coder,MEX 文件将自动从 MATLAB 代码生成,该代码通过 coder.ceval
使用 codegen
命令或 MATLAB Coder App
一些基本差异
(注意我一直使用 C,但 C++ 也可用于 MEX 文件)
- 编写 MEX 文件时,需要在
mxArray
值和本机 C 类型之间手动移动数据。您需要使用 MEX library and the C/C++ Matrix Library 来执行此操作。如果使用coder.ceval
,可以从您的 MATLAB 代码自动生成 MEX 文件,为您执行此数据编组。 - 单个手写 MEX 文件可以处理多种 MATLAB 数据类型。 MATLAB Coder 需要声明每个参数的类型、大小(数组也可以variable-size)和复杂性。例如,如果您想要一个 MEX 文件对给定输入采用
double
和single
值,则必须为每种输入类型生成一个 MEX 文件。 - 对于手写的 MEX 文件,一旦从 MATLAB 提供的
mxArray
值中检索到数据,就可以编写任意 C 代码来对其进行操作。coder.ceval
要求您编写与 MATLAB Coder 兼容的 MATLAB 代码,以使用它提供的外部代码接口调用 C 函数。对于具有简单接口的功能,例如那些采用数字数组、字符串等的,这可能很简单。对于采用其他数据类型的那些,必须使用更高级的工具,如coder.opaque
,coder.cstructname
and custom 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 开发环境生成代码之后与生成的代码集成。
决定时要考虑的因素
- 与手写 MEX 文件相比,使用 MATLAB Coder 尽早集成 C 代码并自动生成 MEX 接口的好处是否超过使用 MATLAB Coder 外部代码接口所需的工作?
- 使用
coder.ceval
集成外部 C 代码比编写将其公开给 MATLAB 的 MEX 文件然后将 MATLAB Coder 生成的代码与 MEX 文件下的计算内核集成相比更容易还是更难?