主要内容

调用MATLAB从c++函数

调用MATLAB®函数函数宏指令fevalAsync的成员函数matlab:引擎::MATLABEngine类。当您想要将函数参数从c++传递到MATLAB并将函数执行的结果返回给c++时,请使用这些函数。这些成员函数的工作方式类似于MATLAB函数宏指令函数。

调用MATLAB函数:

  • 将函数名作为matlab::引擎::字符串

  • 定义MATLAB函数所需的输入参数。您可以使用本地c++数据类型或MATLAB数据API。有关更多信息,请参见MATLAB数据API

  • 指定MATLAB函数的预期输出数量。一个输出是默认的。有关更多信息,请参见使用多个返回参数调用函数输出控制数

  • 为MATLAB函数的结果定义适当的返回类型。

  • 使用流缓冲区将标准输出和标准错误从MATLAB命令窗口重定向到c++。有关更多信息,请参见重定向MATLAB命令窗口输出到c++

使用MATLAB基工作空间中的变量来评估MATLAB语句,使用matlab:引擎::MATLABEngineevalevalAsync成员函数。这些函数使您能够在MATLAB工作空间中创建和使用变量,但不返回值。有关更多信息,请参见评估MATLAB语句从c++

有关如何设置和构建c++引擎程序的信息,请参见构建c++引擎程序

使用单个返回参数调用函数

本例使用MATLAB肾小球囊性肾病函数求两个数的最大公约数。的MATLABEngine:函数宏指令函数返回肾小球囊性肾病函数调用。

使用matlab:: data:: ArrayFactory创建两个标量int16_t参数。将参数传递给MATLABEngine:函数宏指令在一个std::向量

#include "MatlabEngine.hpp" #include "MatlabDataArray.hpp" #include 
void callFevalgcd(){//使用命名空间MATLAB::engine传递包含MATLAB数据数组标量的向量;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//传递包含两个标量参数的向量std::vector args({factory.createScalar(30), factory.createScalar(56)});//调用MATLAB函数并返回结果MATLAB::data::TypedArray result = matlabPtr->feval(u"gcd", args);Int16_t v = result[0];std::cout << "Result: " << v << std::endl;}

你可以叫MATLABEngine:函数宏指令使用本地c++类型。为此,必须通过调用指定返回的类型MATLABEngine:函数宏指令为:

函数宏指令<类型>(…)

例如,返回类型为int在这里:

int cresult = matlabPtr->feval(u"gcd", 30,56);

这个例子定义了matlab:: data:: TypedArray传递类型为的数组MATLAB的√6函数。因为数组中的一个数字是负数,所以MATLAB返回一个复杂的数组作为结果。因此,将返回类型定义为matlab::数据::TypedArray < std::复杂的<二> >

#include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp
void callFevalsqrt(){//使用命名空间MATLAB::engine调用MATLAB sqrt函数;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//定义一个四元素数组matlab::data::TypedArray const argArray = factory。createArray({1,4}, {-2.0, 2.0, 6.0, 8.0});//调用MATLAB函数MATLAB::data::TypedArray> const results = matlabPtr->feval(u"sqrt", argArray);//显示结果int i = 0;for (auto r: results) {double a = argArray[i++];double realPart = r.real();double imgPart = r.imag(); / /复制镜像std:: cout < <“√”< < < <”是“< < realPart  << " + " << “我”imgPart < < < < std:: endl; } }

使用a是安全的matlab::数据::数组用于调用MATLAB函数时的返回类型。例如,您可以使用matlab::数据::数组返回值。

void callFevalsqrt(){//使用命名空间MATLAB::engine调用MATLAB sqrt函数;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//定义一个四元素数组matlab::data:: array const argArray = factory。createArray({1,4}, {-2.0, 2.0, 6.0, 8.0});//调用MATLAB函数MATLAB::data::Array结果= matlabPtr->feval(u"sqrt", argArray);//显示结果(int i = 0;我< results.getNumberOfElements ();i++) {double a = argArray[i];Std::complex v = results[i];double realPart = v.real(); double imgPart = v.imag(); std::cout << "Square root of " << a << " is " << realPart << " + " << imgPart << std::endl; } }

使用名称/值参数调用函数

一些MATLAB函数接受可选的名称-值对参数。名称是字符数组,值可以是任何类型的值。使用一个std::向量创建一个参数向量,其中包含按正确顺序排列的名称和值。

这个示例代码调用MATLABmovsum函数计算行向量的三点居中移动和,忽略端点计算。这个函数调用需要以下参数:

  • 数字数组

  • 标量窗口长度

  • 由字符数组组成的名称-值对端点丢弃

下面是等效的MATLAB代码:

A = [4 8 6 -1 -2 -3 -1 3 4 5];M = movsum (3“端点”“丢弃”);

将参数传递给MATLABEngine:函数宏指令作为一个std::向量包含MATLAB函数的这些参数。属性创建每个参数matlab:: data:: ArrayFactory

void callFevalmovsum(){//使用命名空间matlab::engine传递包含各种类型参数的向量;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//创建一个输入参数的向量std::vector args({factory. data::Array);createArray({1, 10}, {4, 8, 6, -1, -2, -3, -1, 3, 4, 5}), factory. createcharar (3), factory.createCharArray("Endpoints"), factory.createCharArray("discard")});//调用MATLAB函数MATLAB::data::TypedArray const result = matlabPtr->feval(u"movsum", args);//显示结果int i = 0;(汽车r:结果){std:: cout < <”(“< <我的结果 ++ << "] = " << r < < std:: endl;} }

异步调用函数

这个例子调用MATLABconv函数乘以两个多项式。后调用MATLABEngine: fevalAsync,使用FutureResult::从MATLAB中得到结果。

#include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp
static void callFevalAsync(){//使用命名空间MATLAB::engine异步调用MATLAB函数;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//创建输入参数数组std::vector({1, 3},{1, 0, 1}), factory. createArray({1, 3},{1, 0, 1})createArray({1,2},{2,7})});字符串函数(u“conv”);//异步调用函数futurerresult  future = matlabPtr->fevalAsync(func, args);//获取结果matlab::data::TypedArray results = future.get();//显示结果std::cout << "Coefficients: " << std::endl;For (auto r: results) {std::cout << r << " " << std::endl;} }

使用多个返回参数调用函数

这个示例代码使用MATLAB肾小球囊性肾病函数从作为输入传递的两个数值中找到最大公约数和Bézout系数。的肾小球囊性肾病函数可以返回一个或三个参数,这取决于函数调用请求的输出数量。在这个例子中,调用MATLAB肾小球囊性肾病函数返回三个输出。

默认情况下,MATLABEngine:函数宏指令假设返回值的数量为1。因此,必须指定返回值的实际数量作为第二个参数MATLABEngine:函数宏指令

在这个例子中,MATLABEngine:函数宏指令返回一个std::向量包含三个结果的肾小球囊性肾病函数调用。返回值是标量整数。

#include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp
void multiOutput(){//传递包含MATLAB数据数组的向量,使用命名空间MATLAB::engine;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();std::cout << "Started MATLAB Engine" << std::endl;//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//创建MATLAB数据数组的向量数组std::vector< MATLAB::data:: array > args({factory.createScalar(30), factory.createScalar(56)});//调用gcd函数,得到3个输出const size_t numReturned = 3;std::vector result = matlabPtr->feval(u"gcd", numReturned, args);//显示结果(auto r: result) {std::cout << "gcd output: " << int16_t(r[0]) << std::endl;} }

使用本地c++类型调用函数

在调用MATLAB函数时,可以使用本机c++类型。MATLABEngine:函数宏指令MATLABEngine: fevalAsync接受作为MATLAB函数参数传递的标量c++类型。要将数组和其他类型传递给MATLAB函数,请使用MATLAB数据API。有关此API的更多信息,请参见MATLAB数据API

这个示例使用int16_t值作为输入和astd::元组从MATLAB返回结果肾小球囊性肾病函数。

这里是等效的MATLAB代码。

(G, U, V) =肾小球囊性肾病(int16 (30), int16 (56));
#include "MatlabEngine.hpp" #include  #include  .
void multiOutputTuple(){//使用命名空间MATLAB::engine从MATLAB函数调用返回元组;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//调用MATLAB gcd函数std::tuple nresults;nresults = matlabPtr->feval> (u"gcd", int16_t(30), int16_t(56));//显示结果int16_t G;int16_t U;int16_t V;std::tie(G, U, V) = nresults;std:: cout < < < < G“肾小球囊性肾病:”  << ", " << " Bezout U:“< < U  << ", " << " Bezout V:“< < V < < std:: endl;}

有关成员函数语法的详细信息,请参见matlab:引擎::MATLABEngine

输出控制数

MATLAB函数可以根据请求的输出数量而有不同的行为。有些函数可以不返回输出或返回指定数量的输出。

例如,MATLAB暂停函数在指定的秒数内保持执行。然而,如果你打电话暂停使用输出参数,它会立即返回一个状态值,而不会暂停。

暂停(20)暂停20秒
状态=暂停(20);%无暂停,返回暂停状态

这个例子中调用暂停不指定输出。与无效输出指定后,MATLAB暂停执行20秒。

# include“MatlabEngine.hpp”
void void void output(){//使用命名空间matlab::engine从feval没有输出;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//调用没有输出的pause函数matlabPtr->feval(u"pause", 20);}

这叫MATLABEngine:函数宏指令使用将MATLAB函数参数定义为std::向量数组< matlab::数据::>.在不指定输出参数的情况下,MATLAB将暂停执行20秒。

#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp" #include "MatlabEngine.hpp"
void zeroOutput(){//使用命名空间matlab::engine从feval没有输出;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//调用没有输出的pause函数matlab::data::Array arg = factory.createScalar(20);const size_t numReturned = 0;matlabPtr->feval(u"pause", numReturned, {arg});}

MATLAB时钟函数以日期向量的形式返回当前日期和时间。如果你赋值两个输出,时钟以布尔值的形式返回第二个输出,该值指示是否为系统时区中的夏令时。

这个例子调用时钟函数具有一个或两个输出,具体取决于输入参数的值。传递给调用的第二个参数MATLABEngine:函数宏指令确定从多少输出请求时钟

调用MATLABEngine:函数宏指令与这些参数。

输入

MATLAB函数名 const matlab::引擎::字符串
数量的输出 const size_t
MATLAB函数的输入参数(空) std::向量数组< matlab::数据::>

输出

所有输出 std::向量数组< matlab::数据::>
#include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp" #include " dataarray .hpp
void varOutputs(const bool tZone){使用命名空间matlab::engine;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();std::cout << "Started MATLAB Engine" << std::endl;//定义输出数量size_t numReturned(0);if (tZone) {numReturned = 2;} else {numReturned = 1;} std::vector dateTime = matlabPtr->feval(u"clock", numReturned, {});matlab::data::Array dateVector = dateTime[0];//显示结果(int i = 0;我< 6; i++) { std::cout << double(dateVector[i]) << " "; } if (tZone) { matlab::data::Array DTS = dateTime[1]; if (bool(DTS[0])) { std::cout << "It is Daylight Saving Time" << std::endl; } else { std::cout << "It is Standard Time" << std::endl; } } }

另请参阅

|

相关的话题