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