Main Content

MATLAB から C++ への変数の引き渡し

matlab::engine::MATLABEngine のメンバー関数getVariablegetVariableAsyncを使用して、MATLAB® ベースまたはグローバル ワークスペースから C++ プログラムに変数を渡します。matlab::data::Array として変数を C++ に返します。

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

C++ への MATLAB 計算結果の取り込み

このサンプル コードは、MATLABEngine::eval を使用して MATLAB で計算を実行し、MATLABEngine::getVariable を使用して結果を取得します。

MATLAB 関数 cart2sph は、直交座標の点を球面座標の表現に変換します。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <iostream>
void callgetVars() {
    using namespace matlab::engine;

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

    // Evaluate MATLAB statement
    matlabPtr->eval(u"[az,el,r] = cart2sph(5,7,3);");

   // Get the result from MATLAB
    matlab::data::TypedArray<double> result1 = matlabPtr->getVariable(u"az");
    matlab::data::TypedArray<double> result2 = matlabPtr->getVariable(u"el");
    matlab::data::TypedArray<double> result3 = matlabPtr->getVariable(u"r");

    // Display results
    std::cout << "az: " << result1[0] << std::endl;
    std::cout << "el: " << result2[0] << std::endl;
    std::cout << "r: " << result3[0] << std::endl;
}

MATLAB オブジェクトの取得とプロパティへのアクセス

matlab::engine::MATLABEngine のメンバー関数getVariableまたはgetVariableAsyncを使用して、MATLAB オブジェクト変数を取得します。オブジェクトを matlab::data::Array として C++ に返します。matlab::engine::MATLABEngine のメンバー関数getPropertyまたはgetPropertyAsyncを使用して、オブジェクトのプロパティにアクセスします。

このサンプル コードは、MATLAB の figure オブジェクトを作成してオブジェクト ハンドルを C++ に返します。figure の Units プロパティの値は常に文字配列になります。したがって、figure の Units プロパティをクエリするには、figure プロパティの値 (既定値は pixels) を指定して matlab::data::CharArray を返します。

#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
#include <iostream>
void callgetVariables() {
    using namespace matlab::engine;

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

    // Create figure window
    matlabPtr->eval(u"figureHandle = figure;");

    //Get figure handle and Units property
    matlab::data::Array figHandle = matlabPtr->getVariable(u"figureHandle");
    matlab::data::CharArray units = matlabPtr->getProperty(figHandle, u"Units");

    // Display property value
    std::cout << "Units property: " << units.toAscii() << std::endl;
}

オブジェクト配列からのプロパティの取得

オブジェクト変数がオブジェクトの配列である場合、アクセスする配列内のオブジェクトのインデックスを指定して、getProperty または getPropertyAsync を呼び出します。たとえば、オブジェクト配列 objectArray の 4 番目の要素における Units プロパティの値を取得するには、2 番目の入力引数にインデックスを指定します。

matlab::data::CharArray units = matlabPtr->getProperty(objectArray, 3, u"Units");

MATLAB オブジェクトでのプロパティの設定

MATLAB オブジェクトのプロパティ値を C++ から設定するには、matlab::engine::MATLABEngine のメンバー関数setPropertyまたはsetPropertyAsyncを使用します。オブジェクトのプロパティにアクセスするには、MATLAB ワークスペースからオブジェクト変数を取得し、値を C++ 変数に設定します。MATLAB ワークスペースのオブジェクトは、設定するプロパティ値で更新されます。

MATLABEngine::feval および MATLABEngine::fevalAsync への呼び出しからオブジェクトを返し、そのオブジェクトのプロパティ値を設定することもできます。

このサンプルコードは、MATLAB の figure オブジェクトを作成し、オブジェクトを C++ に返します。コードは figure の Color プロパティを red に設定します。これにより、MATLAB ワークスペースのオブジェクトのプロパティ値が変更されます。

Color プロパティの値は char 配列であるため、matlab::data::ArrayFactory を使用して新しい値を定義する matlab::data::CharArray を作成します。

void getObject() {
    using namespace matlab::engine;

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

    //Create MATLAB data array factory
    matlab::data::ArrayFactory factory;

    // Create figure window
    size_t numArguments(1);
    std::vector<matlab::data::Array> figureHandle = matlabPtr->feval(u"figure", numArguments, {});

    // Pause to display the figure
    matlabPtr->eval(u"pause(5)");

    // Set the Color property to red
    matlabPtr->setProperty(figureHandle[0], u"Color", factory.createCharArray("red"));
    matlabPtr->eval(u"pause(10)");
}

オブジェクト配列からのプロパティの設定

オブジェクト変数がオブジェクトの配列である場合、アクセスする配列内のオブジェクトのインデックスを指定して、setProperty または setPropertyAsync を呼び出します。たとえば、オブジェクト配列 objectArray の 4 番目の要素における Color プロパティの値を設定するには、2 番目の入力引数にインデックスを指定します。

matlabPtr->setProperty(objectArray, 3, u"Color", factory.createCharArray("red"));

参考

|

関連するトピック