呼叫MATLAB从C函数++

MATLAB电话®从C函数++使用fevalfevalAsync的成员函数matlab的发动机:: :: MATLABEngine类。当你想从C ++函数参数传递给MATLAB和返回函数执行到C ++的结果,使用这些功能。这些成员函数的工作方式类似于MATLABfeval功能。

要调用MATLAB函数:

  • 传递函数名作为matlab的发动机:: ::字符串

  • 定义由MATLAB功能所需的输入参数。您可以使用原生C ++数据类型或MATLAB数据API。欲了解更多信息,请参阅MATLAB数据API

  • 指定从MATLAB函数预期产出的数量。一个输出是默认的。欲了解更多信息,请参阅与多参数返回呼叫功能输出的控制数

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

  • 使用流缓冲器从MATLAB命令窗口标准输出和标准误差重定向到C ++。欲了解更多信息,请参阅重定向MATLAB命令窗口输出到C ++

为了评估使用变量在MATLAB基工作区MATLAB语句,使用matlab的发动机:: :: MATLABEngineEVALevalAsync成员函数。这些功能使您能够创建并在MATLAB工作区使用的变量,但不返回值。欲了解更多信息,请参阅评估由C MATLAB声明++

有关如何设置和构建C ++发动机项目的信息,请参阅构建C ++发动机项目

与单返回的参数调用函数

本例使用MATLABGCD功能找到两个数的最大公约数。该MATLABEngine :: feval成员函数返回的结果GCD函数调用。

使用MATLAB ::数据:: ArrayFactory创建两个标int16_t参数。传递参数给MATLABEngine :: feval在一个的std ::矢量

的#include “MatlabEngine.hpp” 的#include “MatlabDataArray.hpp” 的#include 
空隙callFevalgcd(){//使用命名空间MATLAB ::发动机含MATLAB数据阵列标量通行证向量;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;含有//通行证矢量2个标量ARGS在矢量的std ::矢量 ARGS({factory.createScalar (30),factory.createScalar (56)});//调用MATLAB函数和返回结果的matlab ::数据:: TypedArray 导致= matlabPtr-> feval(u “的GCD”,参数);int16_t V =结果[0];性病::法院<< “结果:” << v <<的std :: ENDL;}

您可以拨打MATLABEngine :: feval使用本地C ++类型。要做到这一点,你必须指定返回类型与调用MATLABEngine :: feval如:

feval <类型>(...)

例如,返回的类型是INT这里:

INT cresult = matlabPtr-> feval 的(u “的GCD”,30,56);

这个例子定义了一个MATLAB ::数据:: TypedArray传递类型的数组到MATLAB开方功能。由于阵列中的号码中的一个是负的,MATLAB返回一个复数排列作为结果。因此,定义返回类型作为MATLAB ::数据:: TypedArray <性病::复杂<双>>

的#include “MatlabDataArray.hpp” 的#include “MatlabEngine.hpp” 的#include 
空隙callFevalsqrt(){//调用MATLAB SQRT上使用的命名空间的matlab ::发动机阵列功能;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;//定义一个四元件阵列MATLAB ::数据:: TypedArray <双>常量必要参数= factory.createArray({1,4},{-2.0,2.0,6.0,8.0});//调用MATLAB函数MATLAB ::数据:: TypedArray <性病::复杂<双>> const的结果= matlabPtr-> feval(U “SQRT”,必要参数);//显示结果INT I = 0;为(自动R:结果){加倍=必要参数[I ++];双realPart = r.real();加倍imgPart = r.imag();的std :: COUT << <<一个<< “是”, “平方根” << realPart << “+” << imgPart << “i” 的<<的std :: ENDL; } }

它是安全使用MATLAB ::数据::阵列对于返回类型调用MATLAB函数时。例如,你可以使用一个写前面的例子MATLAB ::数据::阵列对于返回值。

空隙callFevalsqrt(){//调用MATLAB SQRT上使用的命名空间的matlab ::发动机阵列功能;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;//定义一个四元件阵列MATLAB ::数据::阵列常量必要参数= factory.createArray({1,4},{-2.0,2.0,6.0,8.0});//调用MATLAB函数MATLAB ::数据::阵列结果= matlabPtr-> feval(U “SQRT”,必要参数);//显示结果(中间体I = 0;我 V =结果[I];双realPart = v.real();加倍imgPart = v.imag();的std :: COUT << <<一个<< “是”, “平方根” << realPart << “+” << imgPart <<的std :: ENDL; } }

与名称/值参数来调用函数

一些MATLAB函数接受可选的名称 - 值对的参数。名称是字符阵列和值可以是任何类型的值。用一个的std ::矢量创建的含有正确序列的名称和值的参数的向量。

此示例代码调用MATLABmovsum函数来计算三点中心移动的行向量的总和,丢弃端点计算。这个函数调用需要这些参数:

  • 数值数组

  • 标窗口长度

  • 名称 - 值对组成的字符阵列的端点丢弃

下面是对应的MATLAB代码:

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

传递参数给MATLABEngine :: feval作为一个的std ::矢量包含这些参数的MATLAB功能。创建使用的每个参数MATLAB ::数据:: ArrayFactory

空隙callFevalmovsum(){含有各种类型的使用命名空间MATLAB ::发动机参数//通行证向量;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;//创建的输入参数的向量的std ::矢量 ARGS({factory.createArray <双>({1,10},{4,8,6,-1,-2,-3,-1,3,4,5}),factory.createScalar (3),factory.createCharArray( “端点”),factory.createCharArray( “丢弃”)});//调用MATLAB函数MATLAB ::数据:: TypedArray <双>常量结果= matlabPtr-> feval(U “movsum”,参数);//显示结果INT I = 0;为(自动R:结果){的std :: COUT << “结果[” << i ++在<< “] =” <<  -  [R <<的std :: ENDL;}}

呼叫功能异步

下面的示例调用MATLABCONV函数来乘两个多项式。打完电话后MATLABEngine :: fevalAsync, 用将FutureResult :: GET获得从MATLAB的结果。

的#include “MatlabDataArray.hpp” 的#include “MatlabEngine.hpp” 的#include 
静态无效callFevalAsync(){//使用异步命名空间MATLAB ::发动机呼叫MATLAB函数;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;//创建输入变量阵列的std ::矢量 ARGS({factory.createArray <双>({1,3},{1,0,1}),factory.createArray <双>({1,2},{2,7})});字符串FUNC(U “转化”);//调用函数asnychronously使用FutureResult 未来= matlabPtr-> fevalAsync(FUNC,参数);//取得结果matlab的::数据:: TypedArray <双>结果的Future.get =();//显示结果的std ::法院<< “系数:” <<的std :: ENDL;对于(汽车R:结果){性病::法院<< [R << “” <<的std :: ENDL;}}

与多参数返回呼叫功能

此示例代码使用MATLABGCD功能找到的最大公约数和系数的Bezout从两个数值通过作为输入。该GCD函数可以返回一个或三个参数,取决于有多少产出函数调用的请求。在这个例子中,调用MATLABGCD函数返回三个输出。

默认,MATLABEngine :: feval假设返回值的数量是一个。因此,你必须指定返回值的实际数量作为第二个参数MATLABEngine :: feval

在这个例子中,MATLABEngine :: feval回报的std ::矢量含的三个结果GCD函数调用。返回的值是标量整数。

的#include “MatlabDataArray.hpp” 的#include “MatlabEngine.hpp” 的#include 
空隙多输出(){//使用命名空间MATLAB ::发动机含MATLAB数据阵列阵列通行证向量;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();性病::法院<< “入门MATLAB引擎” <<的std :: ENDL;//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;//创建MATLAB数据阵列阵列矢量的std ::矢量 ARGS({factory.createScalar (30),factory.createScalar (56)});//调用GCD函数,得到3个输出常量为size_t numReturned = 3;的std ::矢量导致= matlabPtr-> feval(u “的GCD”,numReturned,参数);//显示结果为(自动R:结果){的std :: COUT << “最大公约数输出:” << int16_t(R [0])<<的std :: ENDL;}}

与本地C ++类型的呼叫功能

调用MATLAB功能时,您可以使用本机C ++类型。MATLABEngine :: fevalMATLABEngine :: fevalAsync接受某些标C ++类型作为MATLAB函数参数传递。传递数组和其它类型到MATLAB函数,使用MATLAB数据API。有关此API的更多信息,请参阅MATLAB数据API

本例使用int16_t值作为输入和一个的std ::元组从MATLAB返回结果GCD功能。

下面是对应的MATLAB代码。

[G,U,V] = GCD(INT16(30),INT16(56));
的#include “MatlabEngine.hpp” 的#include <的iostream>的#include <元组>
空隙multiOutputTuple()使用的命名空间的matlab ::发动机MATLAB函数调用{//返回的元组;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//调用MATLAB gcd上述功能的std ::元组 nresults;nresults = matlabPtr-> feval <性病::元组>(u “的GCD”,int16_t(30),int16_t(56));//显示结果int16_t G;int16_t U;int16_t V;的std ::领带(G,U,V)= nresults;的std :: COUT << “GCD:” <<ģ<< “ ”<< “的Bezout U:” << U <<“,” << “的Bezout五:” << V <<的std :: ENDL;}

有关成员函数语法的具体信息,请参阅matlab的发动机:: :: MATLABEngine

输出的控制数

MATLAB功能可以表现不同取决于要求的产出数量。一些功能可以返回没有输出或输出指定数量。

例如,MATLAB暂停功能保持用于的指定的秒数执行。但是,如果你打电话暂停有一个输出参数,它不停顿状态值立即返回。

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

这个例子电话暂停不分配输出。同空虚指定的输出,MATLAB暂停20秒执行。

#包括“MatlabEngine.hpp”
空隙voidOutput()从feval使用命名空间MATLAB ::发动机{//无输出;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();没有输出//调用暂停功能matlabPtr-> feval <空隙>(U “暂停”,20);}

这调用MATLABEngine :: feval采用了MATLAB函数参数定义为一个签名的std ::矢量。不分配输出参数,MATLAB暂停20秒执行。

#包括 “MatlabDataArray.hpp” 的#include “MatlabEngine.hpp”
空隙zeroOutput()从feval使用命名空间MATLAB ::发动机{//无输出;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();//创建MATLAB数据阵列工厂MATLAB ::数据:: ArrayFactory工厂;没有输出MATLAB ::数据//调用暂停功能::阵列ARG = factory.createScalar (20);常量为size_t numReturned = 0;matlabPtr-> feval(U “暂停”,numReturned,{ARG});}

在MATLAB时钟函数返回当前的日期和时间作为日期矢量。如果您分配两个输出,时钟返回第二输出作为布尔值,指示如果是夏令时在系统中的时区。

下面的示例调用时钟具有一个输出或两个输出,这取决于输入参数的值的功能。传递给调用的第二个参数MATLABEngine :: feval确定多少输出到从请求时钟

呼叫MATLABEngine :: feval这些论点。

输入

MATLAB函数名 常量MATLAB ::引擎::字符串
输出数量 常量为size_t
输入参数的功能的MATLAB(空) 的std ::矢量

输出

所有输出 的std ::矢量
的#include “MatlabDataArray.hpp” 的#include “MatlabEngine.hpp” 的#include 
空隙varOutputs(常量布尔tZone){命名空间使用MATLAB ::发动机;//开始MATLAB引擎同步的std ::的unique_ptr  matlabPtr = startMATLAB();性病::法院<< “入门MATLAB引擎” <<的std :: ENDL;//定义的为size_t numReturned输出数(0);如果(tZone){numReturned = 2;}否则{numReturned = 1;}的std ::矢量日期时间= matlabPtr-> feval(U “时钟”,numReturned,{});自动dateVector =日期时间[0];//显示结果(中间体I = 0;我<6; i ++在){的std :: COUT <<双(dateVector [I])<<““;}如果(tZone){自动DTS =日期时间[1]; if (bool(DTS[0])) { std::cout << "It is Daylight Saving Time" << std::endl; } else { std::cout << "It is Standard Time" << std::endl; } } }

也可以看看

|

相关话题