Main Content

MEX からの MATLAB 変数の設定と取得

MEX 関数は、MEX 関数の実行時に MATLAB® ベースおよびグローバル ワークスペースに変数を配置できます。MEX 関数は、MEX 関数の実行時に MATLAB ベースおよびグローバル ワークスペースから変数を取得できます。

MEX 関数から MATLAB ベース ワークスペースまたはグローバル ワークスペースに変数を配置するには、関数setVariableを使用します。

MATLAB ベース ワークスペースまたはグローバル ワークスペースから変数を取得して MEX 関数に取り込むには、関数getVariableを使用します。

MATLAB ワークスペースからの変数の取得

MATLAB ベース ワークスペースに result という名前の変数があるとします。この変数は double 型です。

result =  1^3 + 5^3 + 3^3;

MATLAB ワークスペースから変数 result を取得するには、getVariable を呼び出します。変数が matlab::data::Array として返されます。

#include "mex.hpp"
#include "mexAdapter.hpp"

using matlab::mex::ArgumentList;
using namespace matlab::engine;
using namespace matlab::data;

class MexFunction : public matlab::mex::Function {
    ArrayFactory factory;
    std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {
        Array result = matlabPtr->getVariable(u"result");
        double mexResult = std::move(result[0]);
    }
};

変数 result は、MATLAB ワークスペース内にある変数 result の共有コピーです。MEX 関数の result をネイティブ double 変数 mexResult に代入するときに std::move を使用すると、この値の MATLAB ワークスペース内の変数との値の共有が解除されます。

MATLAB ワークスペースへの変数の配置

MEX 関数では、変数を MATLAB ベースまたはグローバル ワークスペースに配置できます。同じ名前の変数が指定したワークスペース内に存在する場合は、setVariable によって上書きされます。

たとえば、MATLAB グローバル ワークスペースから変数を使用可能にして、任意の MATLAB 関数がこのグローバル変数を定義できるようにすることが可能です。

次の MEX 関数は、mexGlobal という名前のグローバル変数を作成します。この変数の値は 153 です。

#include "mex.hpp"
#include "mexAdapter.hpp"

using matlab::mex::ArgumentList;
using namespace matlab::engine;
using namespace matlab::data;

class MexFunction : public matlab::mex::Function {
    ArrayFactory factory;
    std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {
        Array val = factory.createScalar(153.0);
        matlabPtr->setVariable(u"mexGlobal", val, WorkspaceType::GLOBAL);
    }
};

MATLAB 関数からこのグローバル変数にアクセスするには、global キーワードを使用して、変数を関数ワークスペース内でグローバルとして定義します。

function testMexGlobal
   global mexGlobal
   localVar = 1^3 + 5^3 + 3^3;
   if localVar == mexGlobal
      disp('Global found')
   end
end

グローバル変数は、その変数をグローバルとして宣言するすべての関数間で共有されます。変数の値をある関数内で変更すると、その値はその変数を global として宣言したすべての関数で参照されます。

変数の設定および取得のコード例

getVariableを使用する詳細な例については、次の 2 つのファイルをダウンロードし、ファイルの説明に従って MEX 関数をビルドして実行してください。

mexgetarray.cpp および mexgetarray.hpp で評価します。

参考

関連するトピック