主要内容

调用MATLAB从c++函数

调用MATLAB®函数从c++使用函数宏指令而且fevalAsync的成员函数matlab:引擎::MATLABEngine类。当您希望将函数参数从c++传递到MATLAB并将函数执行的结果返回到c++时,可以使用这些函数。这些成员函数像MATLAB一样工作函数宏指令函数。

调用MATLAB函数:

要使用MATLAB基本工作区中的变量对MATLAB语句求值,请使用matlab:引擎::MATLABEngineeval而且evalAsync成员函数。这些函数使您能够在MATLAB工作区中创建和使用变量,但不返回值。有关更多信息,请参见从c++评估MATLAB语句

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

调用带有单个返回参数的函数

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

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

#include "MatlabEngine.hpp" #include "MatlabDataArray.hpp" #include 
void callFevalgcd(){//传递向量包含MATLAB数据数组标量,使用命名空间MATLAB::engine;//同步启动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 =结果[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 " matlabdata .hpp" #include "MatlabEngine.hpp" #include  .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; } }

它是安全的使用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 results = 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. xml)createArray({1,10}, {4,8,6, -1, -2, -3, -1, 3,4,5}), factory.createScalar(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 " matlabdata .hpp" #include "MatlabEngine.hpp" #include  .hpp
{//使用命名空间MATLAB::engine异步调用MATLAB函数;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//创建输入参数数组std::vector args({factory. properties)createArray({1,3},{1,0,1}),工厂。createArray({1,2},{2,7})});字符串函数(u“conv”);//调用函数异步FutureResult 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 " matlabdata .hpp" #include "MatlabEngine.hpp" #include  .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 Data API。有关此API的更多信息,请参见MATLAB数据API为c++

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

这里是等效的MATLAB代码。

(G, U, V) =肾小球囊性肾病(int16 (30), int16 (56));
#include "MatlabEngine.hpp" #include  #include 
void multiOutputTuple(){//从MATLAB函数调用返回元组,使用命名空间MATLAB::engine;//同步启动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 voidOutput() {// feval使用命名空间matlab::engine没有输出;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//调用没有输出的pause函数matlabPtr->feval(u"pause", 20);}

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

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

另请参阅

|

相关的话题

Baidu
map