主要内容

呼叫MATLAB从C函数++

MATLAB电话®使用C++的函数fevalfevalAsync的成员函数matlab::engine::MATLABEngine类,当你想把函数参数从C++传递到Matlab并返回函数执行结果到C++时,使用这些函数。这些成员函数像MATLAB一样工作。feval作用

要调用MATLAB函数:

  • 将函数名作为matlab::engine::String.

  • 定义MATLAB函数所需的输入参数。可以使用本机C++数据类型或MATLAB数据API。有关详细信息,请参见MATLAB数据API.

  • 指定MATLAB函数的预期输出数。一个输出是默认值。有关详细信息,请参阅与多参数返回呼叫功能控制输出数量.

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

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

要使用MATLAB基本工作区中的变量评估MATLAB语句,请使用matlab::engine::MATLABEngine评估蒸发同步成员职能。这些函数允许您在MATLAB工作区中创建和使用变量,但不返回值。有关详细信息,请参阅从C++中评估MATLAB语句.

有关如何安装和生成C++引擎程序的信息,请参见构建C++引擎程序.

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

本例使用MATLABgcd函数来查找两个数字的最大公约数MATLABEngine::feval成员函数返回gcd函数调用。

使用matlab::data::ArrayFactory创建两个标量int16\t参数。将参数传递给MATLABEngine::feval在一个向量.

#包括“MatlabEngine.hpp”#包括“MatlabDataArray.hpp”#包括
空隙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传递类型为的数组双重的到MATLABsqrt作用因为数组中的一个数字是负数,所以MATLAB返回一个复杂数组作为结果。因此,将返回的类型定义为matlab::data::TypedArray>.

#包括“MatlabDataArray.hpp”#包括“MatlabEngine.hpp”#包括
空隙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::data::Array用于调用MATLAB函数时返回的类型。例如,您可以使用matlab::data::Array对于返回的值。

空隙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函数接受可选的名称-值对参数。名称是字符数组,值可以是任何类型的值。使用向量创建包含正确顺序的名称和值的参数向量。

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

  • 数字数组

  • 标量窗口长度

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

以下是等效的MATLAB代码:

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

将参数传递给MATLABEngine::feval作为一个向量包含MATLAB函数的这些参数。使用matlab::data::ArrayFactory.

void callFevalmovsum(){//使用名称空间matlab::engine传递包含各种类型参数的向量;//同步启动matlab引擎std::unique_ptrmatlabPtr=startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory;//创建输入参数的向量std::vectorargs({factory.createArray({1,10},{4,8,6,-1,-2,-3,-1,3,4,5}),factory.createScalar(3),factory.createCharray(“端点”),factory.createCharray(“放弃”));//调用MATLAB函数MATLAB::data::TypedArrayconst result=matlabPtr->feval(u“movsum”,args);//显示结果int i=0;对于(自动r:result){std::cout<<“结果[“<
            

异步调用函数

这个例子调用MATLAB卷积和多项式相乘函数将两个多项式相乘。调用MATLABEngine::fevalAsync使用未来结果::获取从MATLAB中得到计算结果。

#包括“MatlabDataArray.hpp”#包括“MatlabEngine.hpp”#包括
静态void callFevalAsync(){//使用名称空间MATLAB::engine异步调用MATLAB函数;//同步启动MATLAB引擎std::unique_ptrmatlabPtr=startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory;//创建输入参数数组std::vectorargs({factory.createArray({1,3},{1,0,1}),factory.createArray({1,2},{2,7}));String func(u“conv”);//调用函数asnychronously FutureResultfuture=matlabPtr->fevalAsync(func,args);//获取结果matlab::data::TypedArrayresults=future.Get()//显示结果std::cout<<“系数:”<
            

与多参数返回呼叫功能

此示例代码使用MATLABgcd函数从作为输入传递的两个数值中查找最大公约数和Bézout系数gcd函数可以返回一个或三个参数,具体取决于函数调用请求的输出数量。在本例中,调用MATLABgcd函数返回三个输出。

默认情况下,MATLABEngine::feval假设返回值的数目为1。因此,必须将返回值的实际数目指定为MATLABEngine::feval.

在这个例子中,MATLABEngine::feval返回一个向量包含以下三个结果:gcd函数调用。返回的值是标量整数。

#包括“MatlabDataArray.hpp”#包括“MatlabEngine.hpp”#包括
void multiOutput(){//使用名称空间MATLAB::engine传递包含MATLAB数据数组的向量;//同步启动MATLAB引擎std::unique_ptrmatlabPtr=startMATLAB();std::cout<<”启动MATLAB引擎“<args({factory.createScalar(30),factory.createScalar(56)}”);//调用gcd函数,获取3个输出const size\u t numReturned=3;std::vectorresult=matlabPtr->feval(u“gcd”,numReturned,args);//显示(auto r:result){std::cout<<“gcd输出:”<
            

具有本地C++类型的调用函数

调用MATLAB函数时,可以使用本机C++类型。MATLABEngine::fevalMATLABEngine::fevalAsync接受某些标量C++类型作为Matlab函数参数传递。要将数组和其他类型传递给MATLAB函数,请使用MATLAB数据API。有关此API的更多信息,请参阅MATLAB数据API.

本例使用int16\t值作为输入和std::tuple从MATLAB返回结果的步骤gcd作用

这里是等效的MATLAB代码。

[G,U,V]=gcd(int16(30),int16(56));
#包括“MatlabEngine.hpp”#包括#包括
void multi-outputTuple(){//使用名称空间MATLAB::engine从MATLAB函数调用返回元组;//同步启动MATLAB引擎std::unique\u ptrmatlabPtr=startMATLAB();//调用MATLAB gcd函数std::tuplenresults;nresults=matlabPtr->feval(u“gcd”,int16_t(30),int16_t(56))//显示结果

有关成员函数语法的具体信息,请参见matlab::engine::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::vector。在不指定输出参数的情况下,MATLAB将暂停执行20秒。

#包括“MatlabDataArray.hpp”#包括“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::引擎::字符串
产出数量 常数大小
输入参数的功能的MATLAB(空) std::vector

输出

所有输出 std::vector
#包括“MatlabDataArray.hpp”#包括“MatlabEngine.hpp”#包括
空隙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,{});MATLAB ::数据::阵列dateVector =日期时间[0];//显示结果(中间体I = 0;我<6; i ++在){的std :: COUT <<双(dateVector [I])<<““;}如果(tZone){MATLAB ::数据::阵列DTS =日期时间[1]; if (bool(DTS[0])) { std::cout << "It is Daylight Saving Time" << std::endl; } else { std::cout << "It is Standard Time" << std::endl; } } }

另见

|

相关话题