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-функцию.