主要内容

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

从强类型 MATLAB 函数创建 C++ MATLAB Data API 共享库标头

R2026b

此示例说明如何从强类型 MATLAB® 函数创建 C++ MATLAB Data API 共享库头并将其与示例 C++ 应用程序代码集成。目标系统不需要 MATLAB 的许可副本即可运行该应用程序。

前提条件

  • 通过创建一个 MATLAB 搜索路径可见的新工作文件夹来开始此示例。

  • 通过在 MATLAB 命令提示符下键入 mbuild -setup 来验证您是否已安装 C++ 编译器。

  • 最终用户必须安装 MATLAB Runtime 才能运行应用程序。有关详细信息,请参阅下载并安装 MATLAB Runtime。

    出于测试目的,您可以使用安装的 MATLAB 来代替 MATLAB Runtime。

在 MATLAB 中创建函数

使用以下代码创建一个名为 stronglyTypedFactorial.m 的 MATLAB 文件:

function fact = stronglyTypedFactorial(n)
arguments
    n (1,1) uint64 {mustBeReal, mustBeLessThan(n,22)}
end
fact = 1;
for i = 1:n
    fact = fact*i;
end
end

在 MATLAB 命令提示符下测试该函数。

stronglyTypedFactorial(5)
ans =
  uint64
   120

使用 mcc 命令生成 C++ 共享库头文件

使用 mcc 命令生成 C++ 共享库头。在命令提示符下,键入:

if ~exist('output/cpp','dir')
    mkdir output/cpp
end
mcc -W 'cpplib:stronglyTypedFactorial,generic' stronglyTypedFactorial.m -d output/cpp
在 v2 > generic_interface 文件夹中创建以下文件:

  • readme.txt

  • stronglyTypedFactorial.ctf

  • stronglyTypedFactorialv2.hpp

stronglyTypedFactorialv2.hpp 头文件包含一个接受 uint64_t 类型参量的 C++ 数据数组。

matlab::data::Array stronglyTypedFactorial(std::shared_ptr<MATLABControllerType> _matlabPtr, uint64_t n)

此 uint64_t 映射与 MATLAB 参量的强类型 uint64 数据类型匹配。

n (1,1) uint64 {mustBeReal, mustBeLessThan(n,22)}

有关详细信息,请参阅C++ 和强类型 MATLAB 代码之间的数据类型映射。

#include "MatlabTypesInterface.hpp"

matlab::data::Array stronglyTypedFactorial(std::shared_ptr<MATLABControllerType> _matlabPtr, uint64_t n) { 
    matlab::data::ArrayFactory _arrayFactory;
    matlab::data::ArrayDimensions _dims1 = {1, 1};
    std::vector<matlab::data::Array> _args = {
        _arrayFactory.createArray<uint64_t>(_dims1, {n}) };
    matlab::data::Array _result = _matlabPtr->feval(u"stronglyTypedFactorial", _args);
    return _result;
}

将 C++ MATLAB Data API 共享库头文件与 C++ 应用程序集成

使用以下代码创建一个名为 factApp.cpp 的 C++ 应用程序代码文件。

// Include header files
#include "MatlabCppSharedLib.hpp"
#include "output/v2/generic_interface/stronglyTypedFactorialv2.hpp"
#include <iostream>

int main(const int argc, char *argv[])
{
    if (argc != 2) {
        std::cout << "Usage: " << argv[0] << " <path to .ctf file.>\n";
        return 0;
    }

    try {
        // Initialize MATLAB application
        auto mode = matlab::cpplib::MATLABApplicationMode::IN_PROCESS;
        std::vector<std::u16string> OPTIONS = {u"-nojvm"};
        auto appPtr = matlab::cpplib::initMATLABApplication(mode, OPTIONS);

        // Initialize MATLAB Runtime from the .ctf file
        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));

        // Call the stronglyTypedFactorial MATLAB function
        matlab::data::TypedArray<uint64_t> output = stronglyTypedFactorial(matlabPtr, 5);
        std::cout << "Factorial of 5 is " << output[0] << "\n";
        appPtr.reset();
        return 0;
    } catch (const std::exception & exc) {
        std::cout << exc.what() << std::endl;
        return 1;
    }
}

注意

在编写 C++ 应用程序代码时,必须包含由 mcc 命令或 C++ 共享库编译器应用程序生成的头文件(.hpp 文件),以及使用 #include 指令包含的 MatlabCppSharedLib.hpp 头文件。请根据需要修改文件的路径。

在 MATLAB 命令提示符下编译并链接 C++ 应用程序。

mbuild factApp.cpp -outdir output/cpp

通过将可部署存档(.ctf 文件)作为输入,从系统命令提示符运行该应用程序。为了测试目的,您可以从 MATLAB 命令提示符运行该应用程序。

!output\cpp\factApp.exe output\cpp\v2\generic_interface\stronglyTypedFactorial.ctf
Factorial of 5 is 120

另请参阅

|

主题