MEX-функции могут поместить переменные в основу MATLAB® и глобальные рабочие области во время выполнения MEX-функции. MEX-функции могут получить переменные от основы MATLAB и глобальных рабочих областей во время выполнения MEX-функции.
Чтобы поместить переменные в основу MATLAB или глобальную рабочую область от MEX-функций используют MATLAB:: механизм:: MATLABEngine:: функция setVariable.
Чтобы получить переменные от основы MATLAB или глобальной рабочей области и принести им в MEX-функцию, используйте MATLAB:: механизм:: MATLABEngine:: функция getVariable.
Предположим, что существует переменная под названием result
в базовом рабочем пространстве MATLAB. Эта переменная имеет тип double
.
result = 1^3 + 5^3 + 3^3;
Чтобы получить переменную result
от MATLAB workspace, вызовите 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
является разделяемой копией переменной result
в MATLAB workspace. Используя std::move
при присвоении result
в MEX-функции к нативной переменной double
mexResult
не совместно использует значение с переменной в MATLAB workspace.
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
Глобальные переменные являются общими для все функции, которые объявляют переменную как глобальную переменную. Любое изменение значения к той переменной, в любой функции, видимо ко всем функциям, которые объявляют его как глобальную переменную.
Для полного примера, который использует MATLAB:: механизм:: MATLABEngine:: getVariable, загрузите эти два файла и следуйте инструкциям в файлах, чтобы создать и запустить MEX-функцию.