主要内容

称呼马铃薯来自C ++的函数

致电matlab.®使用C ++的功能使用Feval.Fevalasync.成员职能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求解evalasync.会员职能。这些函数使您可以在MATLAB工作区中创建和使用变量,但不会返回值。有关更多信息,请参阅评估来自C ++的MATLAB语句

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

单个返回的参数调用函数

此示例使用MATLABGCD.功能找到两个数字的最大常见除数。这Matlabengine :: Feval.成员函数返回结果GCD.函数调用。

使用matlab :: data :: ArrayFactory创建两个标量int16_t.论点。传递论点Matlabengine :: Feval.在一个std ::

#include“matlabengine.hpp”#include“matlabdataArray.hpp”#include 
void callfevalgcd(){//传递传染媒介,其中包含使用命名空间matlab ::引擎的matlab数据阵列标量;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//传递传染媒介包含在矢量std :: vector  args({factore.createscalar (30),factory.createscalar (56)});//调用matlab函数和返回结果matlab :: data :: typedArray 结果= matlabptr-> feval(U“gcd”,args);int16_t v =结果[0];std :: cout <<“结果:”<< v << std :: endl;}

你可以打电话Matlabengine :: Feval.使用本机C ++类型。为此,必须使用呼叫指定返回的类型Matlabengine :: Feval.作为:

feval (...)

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

int crsult = matlabptr-> feval (U“gcd”,30,56);

此示例定义了一个matlab :: data :: typedarray传递一系列类型双倍的到matlab.SQRT.功能。因为数组中的数字之一是否定的,因此MATLAB返回一个复杂的数组。因此,将返回的类型定义为amatlab :: data :: typedArray >

#include“matlabdataArray.hpp”#include“matlabengine.hpp”#include 
void callfevalsqrt(){//使用命名空间matlab ::引擎调用matlab sqrt函数上数组;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//定义四元素数组matlab :: data :: typedArray  const argarray = factory.createArray({1,4},{-2.0,2.0,6.0,8.0});//调用matlab函数matlab :: data :: typedArray > const结果= matlabptr-> feval(U“sqrt”,argarray);//显示结果int i = 0;for(auto r:结果){double a = argarray [i ++];双重realpart = r.real();双重IMGPART = R.imag();std :: cout << << <<“的平方根是”<< realpart <<“+”<< imgpart <<“i”<< std :: endl; } }

使用a是安全的matlab :: data :: Array对于调用MATLAB函数时的返回类型。例如,您可以使用使用a的前一个示例matlab :: data :: Array对于返回的值。

void callfevalsqrt(){//使用命名空间matlab ::引擎调用matlab sqrt函数上数组;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//定义四元素数组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; i  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 :: data :: ArrayFactory

void callfevalmovsum(){//传递矢量包含命名空间matlab ::引擎的各种类型的参数;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//创建输入参数的向量std :: vector  args({factore.createarray ({1,10},{4,8,6,-1,-2,-2,-3,-1,3,4,5}),factory.createScalar (3),factory.createCharArray(“端点”),factory.createCharArray(“丢弃”)});//调用matlab函数matlab :: data :: typedArray  const结果= matlabptr-> feval(U“movsum”,args);//显示结果int i = 0;for(auto r:结果){std :: cout <<“结果[”<< i ++ <<“] =”<< r << std :: endl;}}

异步调用函数

此示例调用matlabconv乘以两个多项式的功能。召唤后matlabengine :: fevalasync, 用FutureResult :: Get.从matlab获得结果。

#include“matlabdataArray.hpp”#include“matlabengine.hpp”#include 
静态void callfevalasync(){//使用命名空间matlab ::引擎异步调用matlab函数;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//创建输入参数阵列std :: vector  args({factore.createarray ({1,3},{1,0,1}),factory.createArray ({1,2},{2,7})});弦乐(U“Conv”);//呼叫函数asnychurally futureresult  Future = MatlabPtr-> Fevalasync(Func,Args);//获取结果matlab :: data :: typedArray 结果= Weure.get();//显示结果std :: cout <<“系数:”<< std :: endl;for(auto r:结果){std :: cout << R <<“”<< STD :: ENDL;}}

呼叫函数具有多个返回的参数

此示例代码使用MATLABGCD.功能要找到来自两个数字值的最大常见分割和Bézout系数通过作为输入。这GCD.函数可以返回一个或三个参数,具体取决于函数调用请求的输出。在此示例中,对MATLAB的调用GCD.函数返回三个输出。

默认,Matlabengine :: Feval.假设返回值的数量是一个。因此,您必须将返回值的实际数量指定为第二个参数Matlabengine :: Feval.

在这个例子中,Matlabengine :: Feval.返回A.std ::包含三个结果GCD.函数调用。返回的值是标量整数。

#include“matlabdataArray.hpp”#include“matlabengine.hpp”#include 
void muttionput(){//传递传染媒介,其中包含MATLAB数据阵列数组使用命名空间MATLAB ::引擎;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();std :: cout <<“开始Matlab引擎”<< std :: endl;//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//创建MATLAB数据数组阵列STD :: Vector  args({factore.createScalar (30),factory.createscalar (56)});//呼叫GCD函数,获得3输出Const size_t numReturned = 3;STD :: Vector 结果= Matlabptr-> Feval(U“GCD”,NumReturned,Args);//显示(自动R:结果)的结果{std :: cout <<“GCD输出:”<< INT16_T(r [0])<< std :: endl;}}

使用本机C ++类型调用函数

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

这个例子用途int16_t.值作为输入和astd ::元组返回Matlab的结果GCD.功能。

这是等效的matlab代码。

[g,u,v] = gcd(int16(30),int16(56));
#include“matlabengine.hpp”#include  #include 
void muttionputtuple(){//使用命名空间matlab ::引擎从matlab函数调用中返回元组;// start 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 <<“gcd:”<< g <<“,”<<“bezout u:”<< u <<“,”<<“bezout v:”<< v << std :: endl;}

有关成员函数语法的特定信息,请参阅Matlab :: Engine :: Matlabengine

控制输出数量

MATLAB函数可以根据要求的输出数量不同。某些功能可以返回任何输出或指定数量的输出。

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

暂停(20)%暂停20秒
州=暂停(20);百分比暂停,返回暂停状态

这个例子呼叫暂停不分配输出。和空白指定的输出,MATLAB暂停执行20秒。

#include“matlabengine.hpp”
void voidoutput(){//使用命名空间matlab ::引擎的Feval输出;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//呼叫暂停功能,没有输出matlabptr-> feval (u“暂停”,20);}

这个电话Matlabengine :: Feval.使用定义MATLAB函数参数的签名作为aSTD :: Vector 。如果不分配输出参数,MATLAB暂停执行20秒。

#include“matlabdataArray.hpp”#include“matlabengine.hpp”
void relooutput(){//从feval使用命名空间matlab ::引擎的输出;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();//创建MATLAB数据阵列Factory MATLAB :: DATA :: ArrayFactory Factory;//呼叫暂停函数没有输出matlab :: data :: array arg = factory.createscalar (20);const size_t numreturned = 0;matlabptr-> feval(你“暂停”,numrereturned,{arg});}

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

这个例子称之为使用一个输出或两个输出,具体取决于输入参数的值。第二个论点传递给了电话Matlabengine :: Feval.确定要从中的输出有多少

称呼Matlabengine :: Feval.有这些论点。

输入

matlab函数名称 Const Matlab :: Engine :: String
输出数量 const size_t.
MATLAB函数的输入参数(空) STD :: Vector

输出

所有输出 STD :: Vector
#include“matlabdataArray.hpp”#include“matlabengine.hpp”#include 
void varoutpuls(const bool tzone){使用命名空间matlab ::引擎;// start matlab引擎同步std :: unique_ptr  matlabptr = startmatlab();std :: cout <<“开始Matlab引擎”<< std :: endl;//定义输出次数size_t numReturned(0);if(tzone){numrerurned = 2;}否则{numrerurned = 1;} std :: vector  datetime = matlabptr-> feval(u“时钟”,numrereturned,{});matlab :: data :: Array DateVector = DateTime [0];//显示结果(int i = 0; i <6; i ++){std :: cout << double(datevector [i])<<“”;}如果(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; } } }

也可以看看

|

相关话题