C++ MATLAB Data API 共享库支持强类型 MATLAB 代码
从 MATLAB® 函数或类创建 C++ 共享库时,您可以使用 MATLAB 和 C++ 之间的标准和自定义数据类型映射来规定如何在 C++ 应用程序代码中表示 MATLAB 数据类型。要指定数据类型要求,您可以使用 MATLAB 函数中的 arguments 模块或 MATLAB 类中的 properties 模块和 arguments 模块。例如,如果您的 C++ 应用程序代码使用 float 数据类型来表示实数标量 double 值,则其在 MATLAB 中的等效表示形式为 (1,1) single {mustBeReal}。
具有强类型数据的 MATLAB 函数示例
function r = stronglyTypedFun(num) arguments num (1,1) single {mustBeReal} end r = magic(num);
具有强类型数据的示例 MATLAB 类
classdef MyPosition properties X (1,1) double {mustBeReal} Y (1,1) double {mustBeReal} end end
有关详细信息,请参阅C++ 和强类型 MATLAB 代码之间的数据类型映射。
当您编译强类型 MATLAB 函数、类或包时,MATLAB Compiler SDK™ 会生成一个 C++ 共享库头(.hpp 文件)和一个可部署存档(.ctf 文件)。要从 MATLAB 命令提示符生成头文件,请使用以下语法输入 mcc 命令:
mcc -W 'cpplib:<library_name>,generic' <MATLAB file(s) and/or package folder(s)> -d <output folder>
提示
使用 C++ 共享库编译器生成头文件:
在导出的函数部分,添加相关的 MATLAB 文件。
在 C++ API 选择部分,选择创建使用 MATLAB Data API 的接口选项,然后点击编译和打包。
头文件 (.hpp) 与可部署存档 (.ctf) 在输出文件夹中的位置相同。
生成的头文件:
将强类型 MATLAB 数据类型映射到 C++ 数据类型。有关示例,请参阅从强类型 MATLAB 函数创建 C++ MATLAB Data API 共享库标头。
包含与同名 MATLAB 包目录相对应的 C++ 命名空间。有关示例,请参阅使用 MATLAB Data API 将 MATLAB 类部署到 C++ 应用程序。
包含与同名 MATLAB 类相对应的 C++ 类。
包含与 MATLAB 类的公共方法相对应的公共 C++ 方法。方法名称保持不变,可以在 C++ 应用程序代码中按原样使用。这些对齐的名称消除了通过
feval函数执行调用类方法的中间层顶层函数的需要。包含 MATLAB 类的公共属性的 C++
get和set方法。MATLAB 类的属性名称以get或set开头。例如,如果 MATLAB 类中的属性名称是UpperLeft,则相应的 C++ 方法名称是getUpperLeft和setUpperLeft。
强类型 MATLAB 类到 C++ 头文件的映射
| 强类型 MATLAB 类 | C++ 头文件片段 |
|---|---|
classdef MyRectangle properties UpperLeft (1,1) shapes.MyPosition LowerRight (1,1) shapes.MyPosition end methods function R = enlarge(R, n) arguments R (1,1) shapes.MyRectangle n (1,1) double {mustBeReal} end % code end function R = show(R) arguments R (1,1) shapes.MyRectangle end % code end end end | |
生成的头文件(.hpp 文件)和 MatlabCppSharedLib.hpp 头文件使用 #include 指令包含在 C++ 应用程序代码中。然后您可以编译并运行该应用程序。
示例 C++ 应用程序代码片段
#include "MatlabCppSharedLib.hpp"
#include "output/cpp/v2/generic_interface/libshapesv2.hpp" //header file generated by mcc
int main(const int argc, char *argv[]) {
try {
// common starter code that can apply to any application
auto mode = matlab::cpplib::MATLABApplicationMode::IN_PROCESS;
std::vector<std::u16string> OPTIONS = {u"-nojvm"};
auto appPtr = matlab::cpplib::initMATLABApplication(mode, OPTIONS);
std::string ctfName(argv[1]);
auto libPtr = matlab::cpplib::initMATLABLibrary(appPtr, std::u16string(ctfName.cbegin(), ctfName.cend()));
std::shared_ptr<MATLABControllerType> matlabPtr(std::move(libPtr));
// application specific code that relies on the generated header
shapes::MyPosition p1(matlabPtr);
...
shapes::MyRectangle r1(matlabPtr);
...
}
}提示
在编写 C++ 应用程序代码时,必须包含由
mcc命令或 C++ 共享库编译器应用程序生成的头文件(.hpp文件),以及使用#include指令包含的MatlabCppSharedLib.hpp头文件。您的 MATLAB 代码必须是强类型的才能利用界面的所有功能。否则,MATLAB 和 C++ 之间的数据映射就不存在,并且您无法使用本机 C++ 数据类型。
在编译过程中,仅从
arguments和properties模块中检索强类型信息。检索到的信息包括数组大小、类型以及它是否为实数。