MATLAB电话®从C函数++使用feval和fevalAsync的成员函数matlab的发动机:: :: MATLABEngine
类。当你想从C ++函数参数传递给MATLAB和返回函数执行到C ++的结果,使用这些功能。这些成员函数的工作方式类似于MATLABfeval
功能。
要调用MATLAB函数:
传递函数名作为matlab的发动机:: ::字符串
。
定义由MATLAB功能所需的输入参数。您可以使用原生C ++数据类型或MATLAB数据API。欲了解更多信息,请参阅MATLAB数据API。
指定从MATLAB函数预期产出的数量。一个输出是默认的。欲了解更多信息,请参阅与多参数返回呼叫功能和输出的控制数。
定义的MATLAB函数的结果适当的返回类型。
使用流缓冲器从MATLAB命令窗口标准输出和标准误差重定向到C ++。欲了解更多信息,请参阅重定向MATLAB命令窗口输出到C ++
为了评估使用变量在MATLAB基工作区MATLAB语句,使用matlab的发动机:: :: MATLABEngine
EVAL和evalAsync成员函数。这些功能使您能够创建并在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_ptrmatlabPtr = 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_ptrmatlabPtr = 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_ptrmatlabPtr = 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_ptrmatlabPtr = 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_ptrmatlabPtr = 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_ptrmatlabPtr = 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;}}
调用MATLAB功能时,您可以使用本机C ++类型。MATLABEngine :: feval
和MATLABEngine :: 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_ptrmatlabPtr = 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_ptrmatlabPtr = startMATLAB();没有输出//调用暂停功能matlabPtr-> feval <空隙>(U “暂停”,20);}
这调用MATLABEngine :: feval
采用了MATLAB函数参数定义为一个签名的std ::矢量
。不分配输出参数,MATLAB暂停20秒执行。
#包括 “MatlabDataArray.hpp” 的#include “MatlabEngine.hpp”
空隙zeroOutput()从feval使用命名空间MATLAB ::发动机{//无输出;//开始MATLAB引擎同步的std ::的unique_ptrmatlabPtr = 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_ptrmatlabPtr = 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; } } }
MATLAB ::数据:: ArrayFactory
|matlab的发动机:: :: MATLABEngine