Main Content

Set and Get MATLAB Variables from MEX

MEX functions can put variables into the MATLAB® base and global workspaces during MEX function execution. MEX functions can get variables from the MATLAB base and global workspaces during MEX function execution.

To put variables in the MATLAB base or global workspace from MEX functions use the setVariable function.

To get variables from the MATLAB base or global workspace and bring them into a MEX function, use the getVariable function.

Get Variable from MATLAB Workspace

Suppose that there is a variable named result in the MATLAB base workspace. This variable is of type double.

result =  1^3 + 5^3 + 3^3;

To get the result variable from the MATLAB workspace, call getVariable, which returns the variable as a 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 variable is a shared copy of the result variable in the MATLAB workspace. Using std::move when assigning result in the MEX function to the native double variable mexResult unshares the value with the variable in the MATLAB workspace.

Put Variable in MATLAB Workspace

MEX functions can put variables in the MATLAB base or global workspace. If a variable with the same name exists in the specified workspace, setVariable overwrites it.

For example, you can make a variable available from the MATLAB global workspace so that any MATLAB function can define this global variable.

This MEX function creates a global variable called mexGlobal. The value of this variable is 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);
    }
};

To access the global variable from MATLAB functions, use the global keyword to define the variable as global in the function workspace.

function testMexGlobal
   global mexGlobal
   localVar = 1^3 + 5^3 + 3^3;
   if localVar == mexGlobal
      disp('Global found')
   end
end

Global variables are shared among all functions that declare the variable as global. Any change of value to that variable, in any function, is visible to all the functions that declare it as global.

Set and Get Variable Example Code

For a complete example that uses getVariable, download these two files and follow the instructions in the files to build and run the MEX function.

mexgetarray.cpp and mexgetarray.hpp.

See Also

Related Topics