主要内容

c++からのMATLAB関数の呼び出し

matlab:引擎::MATLABEngineクラスのメンバ,関数函数宏指令fevalAsyncを使用して,c++からmatlab®関数を呼び出します。これらの関数を使用して,関数引数をc++からMATLABに渡し,関数の実行結果をc++に返します。これらのメンバ,関数は,matlab関数函数宏指令のように動作します。

Matlab関数を呼び出すには,以下を実行します。

  • 関数名をmatlab::引擎::字符串として渡します。

  • Matlab関数に必要な入力引数を定義します。ネティブc++デタ型またはmatlabデタAPIのいずれかを使用できます。詳細にいては,Matlabデ,タAPIを参照してください。

  • 期待されるmatlab関数からの出力数を指定します。既定は出力数1です。詳細にいては,戻り引数を複数指定した関数の呼び出しおよび出力数のコントロ,ルを参照してください。

  • Matlab関数の結果の適切な戻り値の型を定義します。

  • ストリームバッファーを使用して標準出力と標準エラーをMATLABコマンドウィンドウからc++へリダイレクトします。詳細にいては,Matlabコマンドウィンドウの出力をc++にリダescレクトを参照してください。

Matlabベ,スワ,クスペ,スの変数を使用してMatlabステ,トメントを評価するには,matlab:引擎::MATLABEngineのメンバ,関数evalevalAsyncを使用します。これらの関数を使用するとMATLABワークスペースで変数を作成して使用できるようになりますが,その場合,値は返されません。詳細にいては,c++からのmatlabステトメントの評価を参照してください。

c++エンジンプログラムを設定およびビルドする方法の詳細にいては,c++エンジンプログラムのビルドを参照してください。

戻り引数を1指定した関数の呼び出し

この例では,matlab関数肾小球囊性肾病を使用して2の数字の最大公約数を見けます。メンバ,関数MATLABEngine:函数宏指令肾小球囊性肾病関数呼び出しの結果を返します。

matlab:: data:: ArrayFactoryを使用して2のスカラint16_t引数を作成します。引数をstd::向量MATLABEngine:函数宏指令に渡します。

#包括“matlabdata .hpp”#包括“matlabdata .hpp”#
void callFevalgcd(){//使用命名空间MATLAB::engine包含MATLAB数据数组标量的传递向量;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//在vector std::vector args中包含2个标量参数的传递向量({factory.createScalar(30), factory.createScalar(56)});//调用MATLAB函数并返回结果MATLAB::data::TypedArray result = matlabPtr->feval(u"gcd", args);Int16_t v = result[0];std::cout << "Result: " << v << std::endl;}

ネaapl . exeネaapl . exeティブc++型を使用してMATLABEngine:函数宏指令を呼び出すことができます。そのためには,MATLABEngine:函数宏指令への呼び出しの戻り値の型を以下のように指定しなければなりません。

函数宏指令<类型>(…)

たとえば,次での戻り値の型はintになります。

int cresult = matlabPtr->feval(u"gcd", 30,56);

この例では,matlab:: data:: TypedArrayを定義して型の配列をmatlab関数√6に渡します。配列の数値の1が負であるため,matlabは結果として複素数配列を返します。したがって,戻り値の型をmatlab::数据::TypedArray < std::复杂的<二> >として定義します。

#包括“MatlabDataArray.hpp”#包括“MatlabEngine.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.m ag();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;i < 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::向量を使用して,名前と値を正しい順序で含んだ引数のベクトルを作成します。

次のサンプルコ,ドでは,matlab関数movsumを呼び出して行ベクトルの3点の中心移動合計値を計算し,端点での計算を破棄します。この関数呼び出しは,以下の引数を必要とします。

  • 数値配列

  • ウィンドウの長さ(スカラ)

  • 文字配列端点丢弃から構成される名前と値のペア

以下は等価のmatlabコ,ドです。

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

Matlab関数のこれらの引数を含んだstd::向量として,引数をMATLABEngine:函数宏指令に渡します。matlab:: data:: ArrayFactoryを使用して各引数を作成します。

void callFevalmovsum(){//使用命名空间matlab::engine包含各种类型参数的传递向量;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//创建一个输入参数向量std::vector args({factory. factory. Array)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;}}

非同期での関数の呼び出し

この例では,matlab関数convを呼び出して2の多項式を乗算します。MATLABEngine: fevalAsyncを呼び出した後,FutureResult::を使用してmatlabから結果を取得します。

#包括“MatlabDataArray.hpp”#包括“MatlabEngine.hpp”#
static void callFevalAsync(){//使用命名空间MATLAB::engine异步调用MATLAB函数;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();//创建MATLAB数据数组工厂MATLAB::data::ArrayFactory工厂;//创建输入参数数组std::vector args({factory. Array)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;对于(auto r: results) {std::cout << r << " " << std::endl;}}

戻り引数を複数指定した関数の呼び出し

このサンプルコ,ドでは,matlab関数肾小球囊性肾病を使用して,入力として渡される2の数値から最大公約数とベズ係数を求めます。関数肾小球囊性肾病は,関数呼び出しで要求される出力の数によって,1または3の引数を返すことができます。この例では,matlab関数肾小球囊性肾病への呼び出しは3の出力を返します。

既定では,MATLABEngine:函数宏指令は1の戻り値を想定しています。したがって,実際の戻り値の数をMATLABEngine:函数宏指令への2番目の引数として指定しなければなりません。

この例では,関数肾小球囊性肾病の呼び出しによる3の結果を含んだstd::向量MATLABEngine:函数宏指令から返されます。戻り値はスカラ,整数になります。

#包括“MatlabDataArray.hpp”#包括“MatlabEngine.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;}}

ネaapl . exeネaapl . exeティブc++型を指定した関数呼び出し

ネ▪▪ティブc++型を使用してmatlab関数を呼び出すことができます。MATLABEngine:函数宏指令およびMATLABEngine: fevalAsyncは,matlab関数引数として渡された特定のスカラ,c++型を受け入れます。配列およびその他の型をMATLAB関数に渡す場合は,MATLABデータAPIを使用します。このAPIの詳細にいては,Matlabデ,タAPIを参照してください。

この例では,int16_t値を入力として使用し,matlab関数肾小球囊性肾病から結果を返すためにstd::元组を使用します。

以下は等価のmatlabコ,ドです。

[G,U,V] = gcd(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_tint16_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();//调用暂停函数没有输出matlabPtr->feval(u"pause", 20);}

次のMATLABEngine:函数宏指令への呼び出しでは,matlab関数引数をstd::向量数组< matlab::数据::>として定義するシグネチャを使用します。出力引数を割り当てない場合、MATLAB は実行を 20 秒間停止します。

#包含“matlabdatarray .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 numReturned = 0;matlabPtr->feval(u"pause", numReturned, {arg});}

Matlab関数时钟は,現在の日付と時刻を日付ベクトルとして返します。2 .の出力を割り当てる場合,时钟は2番目の出力をシステムのタムゾンが夏時間であるかどうかを示すブル値として返します。

この例では,入力引数の値によって1または2の出力を指定して関数时钟を呼び出します。MATLABEngine:函数宏指令への呼び出しで渡された2番目の引数によって,时钟に対して要求する出力の数が決まります。

これらの引数を指定してMATLABEngine:函数宏指令を呼び出します。

入力

Matlab関数名 const matlab::引擎::字符串
出力数 const size_t
Matlab関数への入力引数(空) std::向量数组< matlab::数据::>

出力

すべての出力 std::向量数组< matlab::数据::>
#包括“MatlabDataArray.hpp”#包括“MatlabEngine.hpp”#
void varOutputs(const bool tZone){使用命名空间matlab::engine;//同步启动MATLAB引擎std::unique_ptr matlabPtr = startMATLAB();std::cout << "Started MATLAB Engine" << std::endl;//定义输出数size_t numReturned(0);if (tZone) {numReturned = 2;} else {numReturned = 1;} std::vector dateTime = matlabPtr->feval(u"clock", numReturned, {});:data::Array dateVector = dateTime[0];//显示(int i = 0;I < 6; i++) { std::cout << double(dateVector[i]) << " "; } if (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; } } }

参考

|

関連するトピック