Установите и получите переменные MATLAB от MEX

MEX-функции могут поместить переменные в основу MATLAB® и глобальные рабочие области во время выполнения MEX-функции. MEX-функции могут получить переменные из основы MATLAB и глобальных рабочих областей во время выполнения MEX-функции.

Чтобы поместить переменные в основу MATLAB или глобальную рабочую область от MEX-функций используют MATLAB:: механизм:: MATLABEngine:: функция setVariable.

Чтобы получить переменные из основы MATLAB или глобальной рабочей области и принести им в MEX-функцию, используйте MATLAB:: механизм:: MATLABEngine:: функция getVariable.

Станьте переменными от рабочего пространства MATLAB

Предположим, что существует переменная под названием 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]);
    }
};

Переменная result является разделяемой копией переменной result в рабочем пространстве MATLAB. Используя std::move при присвоении result в MEX-функции к нативной переменной double mexResult не совместно использует значение с переменной в рабочем пространстве 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

Глобальные переменные являются общими для все функции, которые объявляют переменную как глобальную переменную. Любое изменение значения к той переменной, в любой функции, видимо ко всем функциям, которые объявляют его как глобальную переменную.

Установите и получите переменный пример кода

Для полного примера, который использует MATLAB:: механизм:: MATLABEngine::, загрузите эти два файла и следуйте инструкциям в файлах, чтобы создать и запустить MEX-функцию.

mexgetarray.cpp и mexgetarray.hpp.

Смотрите также

Похожие темы