主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

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++ 共享库编译器生成头文件:

  1. 导出的函数部分,添加相关的 MATLAB 文件。

  2. 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++getset 方法。MATLAB 类的属性名称以 getset 开头。例如,如果 MATLAB 类中的属性名称是 UpperLeft,则相应的 C++ 方法名称是 getUpperLeftsetUpperLeft

强类型 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
namespace shapes {
    class MyRectangle : public MATLABObject<MATLABControllerType> { 
    public:

        // constructors
        MyRectangle() : MATLABObject() {}

        // code

        // properties
        shapes::MyPosition getUpperLeft() {
            // code
        }
        void setUpperLeft(shapes::MyPosition obj) {
            // code
        }
        shapes::MyPosition getLowerRight() {
            // code
        }
        void setLowerRight(shapes::MyPosition obj) {
            // code
        }

        // methods
        matlab::data::Array show() { 
            // code
        }

        matlab::data::Array enlarge(double n) { 
            // code
        }

    };
}

生成的头文件(.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++ 数据类型。

  • 在编译过程中,仅从 argumentsproperties 模块中检索强类型信息。检索到的信息包括数组大小、类型以及它是否为实数。

另请参阅

|

主题