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
で評価します。