matlab::engine::MATLABEngine
C++ プログラムから MATLAB 関数を評価
説明
matlab::engine::MATLABEngine クラスは C++ の計算エンジンとして MATLAB® プロセスを使用します。このクラスは C++ 言語と MATLAB 間のインターフェイスを提供し、これにより、MATLAB の関数と式を C++ プログラムから評価できるようになります。
クラスの詳細
| 名前空間: | matlab::engine |
| インクルード: | MatlabEngine.hpp |
メンバー関数
feval
std::vector<matlab::data::Array> feval(const matlab::engine::String &function,
const size_t numReturned,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())matlab::data::Array feval(const matlab::engine::String &function,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())matlab::data::Array feval(const matlab::engine::String &function,
const matlab::data::Array &arg,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())ResultType feval(const matlab::engine::String &function,
const std::shared_ptr<matlab::engine::StreamBuffer> &output,
const std::shared_ptr<matlab::engine::StreamBuffer> &error,
RhsArgs&&... rhsArgs )ResultType feval(const matlab::engine::String &function,
RhsArgs&&... rhsArgs)入力引数をもつ MATLAB 関数を同期的に評価します。C++ から MATLAB に引数を渡す場合や、MATLAB から C++ に結果を返す場合には feval を使用します。
入力と出力は、MATLAB のデータ API で定義された型、またはネイティブの C++ 型とすることができます。
| 評価する MATLAB 関数またはスクリプトの名前。名前は |
| 返される値の数 |
|
|
| MATLAB 関数に渡される単一の入力引数。 |
| MATLAB 関数からの標準出力を格納するために使用するストリーム バッファー。例については、標準出力またはエラー時のストリーム バッファー タイプの受け渡しを参照してください。 |
| MATLAB 関数からのエラー メッセージを格納するために使用するストリーム バッファー。例については、標準出力またはエラー時のストリーム バッファー タイプの受け渡しを参照してください。 |
| ネイティブ C++ データ型:
|
(R2024a 以降) | |
(R2024a 以降) |
| MATLAB 関数から返される出力。 |
| MATLAB 関数から返される単一の出力。 |
| MATLAB 関数からユーザー指定の型として返される出力。複数の引数を返す場合は |
| MATLAB セッションを使用できません。 |
| 関数に MATLAB ランタイム エラーが存在します。 |
| MATLAB 関数の結果を指定された型に変換できません。 |
| MATLAB 関数に構文エラーが存在します。 |
この例では、数値の配列を MATLAB 関数に渡します。コードは次の手順を実行します。
double 型の数値ベクトルから 2 行 3 列の次元をもつ
matlab::data::Arrayを作成します。共有 MATLAB セッションを開始します。
データ配列を MATLAB の
sqrt関数に渡して、結果を C++ に返します。
#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::vector<double> cppData{ 4, 8, 12, 16, 20, 24 };
// Create a 2-by-3 matlab data array
matlab::data::ArrayFactory factory;
auto inputArray = factory.createArray({ 2, 3 }, cppData.cbegin(), cppData.cend());
// Start MATLAB engine
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
// Pass data array to MATLAB sqrt function
// And return results.
auto result = matlabPtr->feval(u"sqrt", inputArray);ネイティブの C++ 型を使用して feval を呼び出す場合、入力引数はスカラー値に限定されます。たとえば、次のコードはスカラー値の平方根を返します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
// Start MATLAB engine synchronously
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
// Call sqrt function
double result = matlabPtr->feval<double>(u"sqrt", double(27));複数の出力引数を返す関数の場合、MATLAB データ API を使用するか、または C++ 型を使用している場合は std::tuple を使用することができます。例については、ネイティブ C++ 型を指定した関数呼び出しを参照してください。
他の例については、C++ からの MATLAB 関数の呼び出しを参照してください。
fevalAsync
FutureResult<std::vector<matlab::data::Array>> fevalAsync(const matlab::engine::String &function,
const size_t numReturned,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())FutureResult<matlab::data::Array> fevalAsync(const matlab::engine::String &function,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())FutureResult<matlab::data::Array> fevalAsync(const matlab::engine::String &function,
const matlab::data::Array &arg,
const std::shared_ptr<matlab::engine::StreamBuffer> & output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> & error = std::shared_ptr<matlab::engine::StreamBuffer>())FutureResult<ResultType> fevalAsync(const matlab::engine::String &function,
const std::shared_ptr<matlab::engine::StreamBuffer> &output,
const std::shared_ptr<matlab::engine::StreamBuffer> &error,
RhsArgs&&... rhsArgs)FutureResult<ResultType> fevalAsync(const matlab::engine::String &function,
RhsArgs&&... rhsArgs)入力引数と戻り値を指定した MATLAB 関数を、非同期的に評価します。
| 評価する MATLAB 関数またはスクリプトの名前。名前は |
| 返される値の数 |
|
|
| MATLAB 関数に渡される単一の入力引数。 |
| MATLAB 関数からの標準出力を格納するために使用するストリーム バッファー。例については、標準出力またはエラー時のストリーム バッファー タイプの受け渡しを参照してください。 |
| MATLAB 関数からのエラー メッセージを格納するために使用するストリーム バッファー。例については、標準出力またはエラー時のストリーム バッファー タイプの受け渡しを参照してください。 |
| ネイティブ C++ データ型:
|
(R2024a 以降) | |
(R2024a 以降) |
| MATLAB 関数を呼び出した結果を取得するために使用する |
なし
この例では、double 型のスカラー 12.7 を MATLAB の sqrt 関数に非同期的に渡します。次に、FutureResult を使用して結果を取得します。
#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::ArrayFactory factory;
matlab::data::Array argument = factory.createScalar<double>(12.7);
FutureResult<matlab::data::Array> future = matlabPtr->fevalAsync(u"sqrt", std::move(argument));
...
matlab::data::TypedArray<double> result = future.get();eval
void eval(const matlab::engine::String &statement,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer> (),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer> ())MATLAB ステートメントを文字列として同期的に評価します。
| 評価する MATLAB ステートメント |
| MATLAB ステートメントからの標準出力を格納するために使用するストリーム バッファー。例については、画面出力のリダイレクトを参照してください。 |
| MATLAB コマンドからのエラー メッセージを格納するために使用するストリーム バッファー。例については、エラー出力のリダイレクトを参照してください。 |
| MATLAB セッションを使用できません。 |
| MATLAB ステートメントにランタイム エラーがあります。 |
| MATLAB ステートメントに構文エラーがあります。 |
この例では、次の MATLAB ステートメントを評価します。
a = sqrt(12.7);
ステートメントは変数 a を MATLAB ベース ワークスペースに作成します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlabPtr->eval(u"a = sqrt(12.7);");evalAsync
FutureResult<void> evalAsync(const matlab::engine::String &str,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer> (),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer> ())MATLAB ステートメントを文字列として非同期的に評価します。
| 評価する MATLAB ステートメント |
| MATLAB ステートメントからの標準出力を格納するために使用するストリーム バッファー。例については、画面出力のリダイレクトを参照してください。 |
| MATLAB コマンドからのエラー メッセージを格納するために使用するストリーム バッファー。例については、エラー出力のリダイレクトを参照してください。 |
| MATLAB ステートメントの完了を待機するために使用する |
なし
この例では、次の MATLAB ステートメントを非同期的に評価します。
a = sqrt(12.7);
ステートメントは変数 a を MATLAB ベース ワークスペースに作成します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
FutureResult<void> future = matlabPtr->evalAsync(u"a = sqrt(12.7);");getVariable
matlab::data::Array getVariable(const matlab::engine::String &varName,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)MATLAB のベース ワークスペースまたはグローバル ワークスペースから変数を取得します。
| MATLAB ワークスペース内の変数の名前。名前は |
| 変数の取得先の MATLAB ワークスペース (BASE または GLOBAL)。詳細については、 |
| MATLAB のベース ワークスペースまたはグローバル ワークスペースから取得した変数 |
| MATLAB セッションを使用できません。 |
| 要求された変数は指定された MATLAB のベース ワークスペースまたはグローバル ワークスペース内にありません。 |
この例では、varName という名前の変数を MATLAB ベース ワークスペースから取得します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::Array varName = matlabPtr->getVariable(u"varName");getVariableAsync
FutureResult<matlab::data::Array> getVariableAsync(const matlab::engine::String &varName,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)MATLAB のベース ワークスペースまたはグローバル ワークスペースから変数を非同期的に取得します。
| MATLAB ワークスペース内の変数の名前。名前は |
| 変数の取得先の MATLAB ワークスペース (BASE または GLOBAL)。詳細については、 |
| MATLAB ワークスペースから |
なし
この例では、varName という名前の変数を MATLAB ベース ワークスペースから非同期的に取得します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
FutureResult<matlab::data::Array> future = matlabPtr->getVariableAsync(u"varName");
...
matlab::data::Array varName = future.get();setVariable
void setVariable(const matlab::engine::String &varName,
const matlab::data::Array &var,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)MATLAB のベース ワークスペースまたはグローバル ワークスペースに変数を入れます。同じ名前の変数が MATLAB ワークスペース内に存在する場合は、setVariable によって上書きされます。
| MATLAB ワークスペースで作成する変数の名前。名前は |
| MATLAB ワークスペースで作成する変数の値 |
| MATLAB の BASE ワークスペースまたは GLOBAL ワークスペースに変数を入れます。詳細については、 |
| MATLAB セッションを使用できません。 |
この例では、data という名前の変数を MATLAB ベース ワークスペースに入れます。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::Array data = factory.createArray<double>({ 1, 3 }, { 4, 8, 6 });
matlabPtr->setVariable(u"data", data);setVariableAsync
FutureResult<void> setVariableAsync(const matlab::engine::String &varName,
const matlab::data::Array var,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)MATLAB のベース ワークスペースまたはグローバル ワークスペースに非同期的に変数を入れます。同じ名前の変数が MATLAB ベース ワークスペース内に存在する場合は、setVariableAsync によって上書きされます。
| MATLAB ワークスペースで作成する変数の名前。名前は |
| MATLAB ワークスペースで作成する変数の値 |
| MATLAB の BASE ワークスペースまたは GLOBAL ワークスペースに変数を入れます。詳細については、 |
なし
この例では、data という名前の変数を MATLAB ベース ワークスペースに入れます。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::Array data = factory.createArray<double>({ 1, 3 }, { 4., 8., 6. });
FutureResult<void> future = matlabPtr->setVariableAsync(u"data", data);getProperty
matlab::data::Array getProperty(const matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName)matlab::data::Array getProperty(const matlab::data::Array &object,
const matlab::engine::String &propertyName)オブジェクト プロパティの値を取得します。オブジェクトの入力引数がオブジェクトの配列である場合は、プロパティ値を取得するオブジェクトに対応する配列要素のインデックスを指定します。
| MATLAB オブジェクトの配列 |
| スカラー MATLAB オブジェクト |
| オブジェクト配列への 0 ベースのインデックス。その配列内のどのオブジェクトのプロパティ値を返すかを指定します。 |
| プロパティの名前です。名前は |
| 指定した名前のプロパティの値 |
| MATLAB セッションを使用できません。 |
| プロパティが存在しません。 |
この例では、try/catch ブロック内の MATLAB ステートメントを MATLABEngine::eval を使用して評価します。MATLABEngine::getVariable メンバー関数は例外オブジェクトを返します。MATLABEngine::getProperty は、例外 message プロパティの値を matlab::data::CharArray として返します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlabPtr->eval(u"try; surf(4); catch me; end");
matlab::data::Array mException = matlabPtr->getVariable(u"me");
matlab::data::CharArray message = matlabPtr->getProperty(mException, u"message");
std::cout << "messages is: " << message.toAscii() << std::endl;getPropertyAsync
FutureResult<matlab::data::Array> getPropertyAsync(const matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName)FutureResult<matlab::data::Array> getPropertyAsync(const matlab::data::Array &object,
const matlab::engine::String &propertyName)オブジェクト プロパティの値を非同期的に取得します。オブジェクトの入力引数がオブジェクトの配列である場合は、プロパティ値を取得するオブジェクトに対応する配列要素のインデックスを指定します。
| MATLAB オブジェクトの配列 |
| スカラー MATLAB オブジェクト |
| オブジェクト配列への 0 ベースのインデックス。その配列内のどのオブジェクトのプロパティ値を返すかを指定します。 |
| プロパティの名前です。名前は |
| 演算を同期させるために使用する |
なし
この例では、try/catch ブロック内の MATLAB ステートメントを MATLABEngine::eval を使用して評価します。MATLABEngine::getVariable メンバー関数は例外オブジェクトを返します。MATLABEngine::getPropertyAsync は FutureResult を返し、これを使用して例外 message のプロパティ値を matlab::data::CharArray として取得します。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlabPtr->eval(u"try;surf(4);catch me;end");
matlab::data::Array mException = matlabPtr->getVariable(u"me");
FutureResult<matlab::data::Array> future = matlabPtr->getPropertyAsync(mException, u"message");
matlab::data::CharArray message = future.get();
std::cout << "messages is: " << message.toAscii() << std::endl;setProperty
void setProperty(matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)void setProperty(matlab::data::Array &object,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)オブジェクト プロパティの値を設定します。オブジェクトの入力引数がオブジェクトの配列である場合は、プロパティ値を設定するオブジェクトに対応する配列要素のインデックスを指定します。
| MATLAB オブジェクトの配列 |
| スカラー MATLAB オブジェクト |
| オブジェクト配列への 0 ベースのインデックス。その配列内のどのオブジェクトのプロパティ値を設定するかを指定します。 |
| 設定するプロパティの名前。名前は |
const matlab::data::Array &propertyValue | プロパティに代入された値 |
| MATLAB セッションを使用できません。 |
| プロパティが存在しません。 |
この例では、MATLAB オブジェクトのプロパティを設定する方法を説明します。MATLAB グラフを作成して line ハンドル オブジェクトを返します。ラインの LineStyle プロパティの値を文字 : に設定すると、MATLAB の line オブジェクトのプロパティ値が変更され、グラフのライン スタイルが更新されます。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::ArrayFactory factory;
matlab::data::Array yData = factory.createArray<double>({ 1, 5 }, { 4.0, 11.0, 4.7, 36.2, 72.3 });
matlab::data::Array lineHandle = matlabPtr->feval(u"plot", yData);
matlab::data::CharArray lineStyle = factory.createCharArray(":");
matlabPtr->setProperty(lineHandle, u"LineStyle", lineStyle);setPropertyAsync
FutureResult<void> setPropertyAsync(matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)FutureResult<void> setPropertyAsync(matlab::data::Array &object,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)オブジェクト プロパティの値を非同期的に設定します。オブジェクトの入力引数がオブジェクトの配列である場合は、プロパティ値を設定するオブジェクトに対応する配列要素のインデックスを指定します。
| MATLAB オブジェクトの配列 |
| スカラー MATLAB オブジェクト |
| オブジェクト配列への 0 ベースのインデックス。その配列内のどのオブジェクトのプロパティ値を設定するかを指定します。 |
| 設定するプロパティの名前。名前は |
const matlab::data::Array &propertyValue | プロパティに割り当てられた値。 |
なし
この例では、MATLAB オブジェクトのプロパティを非同期的に設定する方法を説明します。MATLAB グラフを作成して line ハンドル オブジェクトを返します。ラインの LineStyle プロパティを文字 : に設定すると、MATLAB の line オブジェクトのプロパティ値が変更され、グラフのライン スタイルが更新されます。
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::ArrayFactory factory;
matlab::data::Array yData = factory.createArray<double>({ 1, 5 }, { 4.0, 11.0, 4.7, 36.2, 72.3 });
matlab::data::Array lineHandle = matlabPtr->feval(u"plot", yData);
matlab::data::CharArray lineStyle = factory.createCharArray(":");
FutureResult<void> future = matlabPtr->setPropertyAsync(lineHandle, u"LineStyle", lineStyle);