Main Content

C++ からの MATLAB ステートメントの評価

MATLAB ステートメントの評価

メンバー関数 MATLABEngine::eval とメンバー関数 MATLABEngine::evalAsync を使用して MATLAB® ステートメントを C++ から評価します。これらのメンバー関数は、MATLAB 関数 eval とよく似ています。関数 MATLABEngine::eval と関数 MATLABEngine::evalAsync は MATLAB ステートメントの評価結果を返しません。

引数を C++ から渡す必要がない場合や値を C++ に返す必要がない場合は、MATLABEngine::eval および MATLABEngine::evalAsync を使用します。これらの関数で実行するステートメントは、MATLAB ワークスペースの変数にアクセスできます。

以下は、MATLAB でステートメントを評価するときの注意点です。

  • これらの関数はステートメントを matlab::engine::String として MATLAB に渡します。

  • リテラル u"…" またはユーティリティ関数 matlab::engine::convertUTF8StringToUTF16String を使用して、std::stringmatlab::engine::String に変換します。

  • 文字列内で名前がつけられた入力引数は、MATLAB ワークスペースになければなりません。

  • 評価の結果は、ステートメント文字列内で変数に代入することができます。ステートメントに代入する値は、MATLAB ベース ワークスペースで作成されます。

  • MATLAB では、ステートメントで作成された変数を初期化する必要がありません。

  • MATLAB 関数からの標準出力とエラー メッセージをストリーム バッファーに格納することができます。

MATLAB での数学関数の評価

このサンプル コードは MATLABEngine::eval を使用して、一連の MATLAB ステートメントを評価します。これらのステートメントは次を行います。

  • meshgrid および exp を使用して、特定の定義域で数学関数を評価する。

  • surf を使用して関数のグラフを作成する。

  • print を使用してグラフを JPEG ファイルへエクスポートする。

以下は等価の MATLAB コードです。

[X, Y] = meshgrid(-2:0.2:2);
Z = X .* exp(-X.^2 - Y.^2);
surf(Z)
print('SurfaceGraph', '-djpeg')
currentFolder = pwd;

以下は、これらのステートメントを MATLAB で実行する C++ コードです。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <iostream>
void evalSurfaceGraph() {
    // Evaluate functions in MATLAB

    using namespace matlab::engine;

    // Start MATLAB engine synchronously
    std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();

    // Evaluate commands in MATLAB
    matlabPtr->eval(u"[X, Y] = meshgrid(-2:0.2:2);");
    matlabPtr->eval(u"Z = X .* exp(-X.^2 - Y.^2);");
    matlabPtr->eval(u"surf(Z)");
    matlabPtr->eval(u"print('SurfaceGraph', '-djpeg')");
    matlabPtr->eval(u"currentFolder = pwd;");

    // Get the name of the folder containing the jpeg file
    matlab::data::CharArray currentFolder = matlabPtr->getVariable(u"currentFolder");
    std::cout << "SurfaceGraph.jpg written to this folder: " << 
          currentFolder.toAscii() << std::endl;
}

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

参考

関連するトピック