matlab::engine::MATLABEngine - Evaluate MATLAB functions from C++ program - MATLAB (original) (raw)
Evaluate MATLAB functions from C++ program
Description
The matlab::engine::MATLABEngine
class uses a MATLABĀ® process as a computational engine for C++. This class provides an interface between the C++ language and MATLAB, enabling you to evaluate MATLAB functions and expressions from C++ programs.
Class Details
Namespace: | matlab::engine |
---|---|
Include: | MatlabEngine.hpp |
Member Functions
- feval
- fevalAsync
- eval
- evalAsync
- getVariable
- getVariableAsync
- setVariable
- setVariableAsync
- getProperty
- getPropertyAsync
- setProperty
- setPropertyAsync
feval
std::vector<matlab::data::Array> feval(const matlab::engine::String &function,
const size_t numReturned,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())
matlab::data::Array feval(const matlab::engine::String &function,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())
matlab::data::Array feval(const matlab::engine::String &function,
const matlab::data::Array &arg,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())
ResultType feval(const matlab::engine::String &function,
const std::shared_ptr<matlab::engine::StreamBuffer> &output,
const std::shared_ptr<matlab::engine::StreamBuffer> &error,
RhsArgs&&... rhsArgs )
ResultType feval(const matlab::engine::String &function,
RhsArgs&&... rhsArgs)
Description
Evaluate MATLAB functions with input arguments synchronously. Usefeval
to pass arguments from C++ to MATLAB and to return a result from MATLAB to C++.
Inputs and outputs can be types defined by the MATLAB Data API or can be native C++ types.
Parameters
const matlab::engine::String &function | Name of the MATLAB function or script to evaluate. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
---|---|
const size_t numReturned | Number of returned values |
const std::vectormatlab::data::Array &args | Multiple input arguments to pass to the MATLAB function in an std::vector. The vector is converted to a column array in MATLAB. |
const matlab::data::Array arg | Single input argument to pass to the MATLAB function. |
const std::shared_ptrmatlab::engine::StreamBuffer &output = std::shared_ptrmatlab::engine::StreamBuffer() | Stream buffer used to store the standard output from the MATLAB function. For an example, see Pass Stream Buffer Type for Standard Output or Error. |
const std::shared_ptrmatlab::engine::StreamBuffer &error = std::shared_ptrmatlab::engine::StreamBuffer() | Stream buffer used to store the error message from the MATLAB function. For an example, see Pass Stream Buffer Type for Standard Output or Error. |
RhsArgs&&... rhsArgs | Native C++ data types: std::floatstd::doublestd::int8_t,std::uint8_tstd::int16_t,std::uint16_tstd::int32_t,std::uint32_tstd::int64_t,std::uint64_tstd::boolstd::string,std::u16string (since R2024a) |
std::vector data types: std::vectorstd::vectorstd::vector<int8_t>,std::vector<uint8_t>std::vector<int16_t>,std::vector<uint16_t>std::vector<int32_t>,std::vector<uint32_t>std::vector<int64_t>,std::vector<uint64_t> (since R2024a) | |
std::complex data types: std::complexstd::complexstd::complex<int8_t>,std::complex<uint8_t>std::complex<int16_t>,std::complex<uint16_t>std::complex<int32_t>,std::complex<uint32_t>std::complex<int64_t>,std::complex<uint64_t> (since R2024a) |
Return Value
std::vectormatlab::data::Array | Outputs returned from MATLAB function. |
---|---|
matlab::data::Array | Single output returned from MATLAB function. |
ResultType | Output returned from MATLAB function as a user-specified type. Can be anstd::tuple if returning multiple arguments. |
Exceptions
matlab::engine::MATLABNotAvailableException | The MATLAB session is not available. |
---|---|
matlab::engine::MATLABExecutionException | There is a MATLAB run-time error in the function. |
matlab::engine::TypeConversionException | The result of a MATLAB function cannot be converted to the specified type. |
matlab::engine::MATLABSyntaxException | There is a syntax error in the MATLAB function. |
Examples
This example passes an array of numeric values to a MATLAB function. The code performs these steps:
- Creates a
matlab::data::Array
with the dimensions 2-by-3 from a vector of numeric values of type double. - Starts a shared MATLAB session.
- Passes the data array to the MATLAB
sqrt
function and returns the result to C++.
#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::vector<double> cppData{ 4, 8, 12, 16, 20, 24 };
// Create a 2-by-3 matlab data array
matlab::data::ArrayFactory factory;
auto inputArray = factory.createArray({ 2, 3 }, cppData.cbegin(), cppData.cend());
// Start MATLAB engine
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
// Pass data array to MATLAB sqrt function
// And return results.
auto result = matlabPtr->feval(u"sqrt", inputArray);
When calling feval
using native C++ types, the input arguments are restricted to scalar values. For example, this code returns the square root of a scalar value.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
// Start MATLAB engine synchronously
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
// Call sqrt function
double result = matlabPtr->feval<double>(u"sqrt", double(27));
For functions that return multiple output arguments, you can use the MATLAB data API or, if using C++ types, an std::tuple
. For an example, see Call Function with Native C++ Types.
For more examples, see Call MATLAB Functions from C++.
fevalAsync
FutureResult<std::vector<matlab::data::Array>> fevalAsync(const matlab::engine::String &function,
const size_t numReturned,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())
FutureResult<matlab::data::Array> fevalAsync(const matlab::engine::String &function,
const std::vector<matlab::data::Array> &args,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer>())
FutureResult<matlab::data::Array> fevalAsync(const matlab::engine::String &function,
const matlab::data::Array &arg,
const std::shared_ptr<matlab::engine::StreamBuffer> & output = std::shared_ptr<matlab::engine::StreamBuffer>(),
const std::shared_ptr<matlab::engine::StreamBuffer> & error = std::shared_ptr<matlab::engine::StreamBuffer>())
FutureResult<ResultType> fevalAsync(const matlab::engine::String &function,
const std::shared_ptr<matlab::engine::StreamBuffer> &output,
const std::shared_ptr<matlab::engine::StreamBuffer> &error,
RhsArgs&&... rhsArgs)
FutureResult<ResultType> fevalAsync(const matlab::engine::String &function,
RhsArgs&&... rhsArgs)
Description
Evaluate MATLAB functions with input arguments and returned values asynchronously.
Parameters
const matlab::engine::String &function | Name of the MATLAB function or script to evaluate. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
---|---|
const size_t numReturned | Number of returned values |
const std::vectormatlab::data::Array &args | Multiple input arguments to pass to the MATLAB function in an std::vector. The vector is converted to a column array in MATLAB. |
const matlab::data::Array arg | Single input argument to pass to the MATLAB function. |
const std::shared_ptrmatlab::engine::StreamBuffer &output = std::shared_ptrmatlab::engine::StreamBuffer() | Stream buffer used to store the standard output from the MATLAB function. For an example, see Pass Stream Buffer Type for Standard Output or Error. |
const std::shared_ptrmatlab::engine::StreamBuffer &error = std::shared_ptrmatlab::engine::StreamBuffer() | Stream buffer used to store the error message from the MATLAB function. For an example, see Pass Stream Buffer Type for Standard Output or Error. |
RhsArgs&&... rhsArgs | Native C++ data types: std::floatstd::doublestd::int8_t,std::uint8_tstd::int16_t,std::uint16_tstd::int32_t,std::uint32_tstd::int64_t,std::uint64_tstd::boolstd::string,std::u16string (since R2024a) |
std::vector data types: std::vectorstd::vectorstd::vector<int8_t>,std::vector<uint8_t>std::vector<int16_t>,std::vector<uint16_t>std::vector<int32_t>,std::vector<uint32_t>std::vector<int64_t>,std::vector<uint64_t> (since R2024a) | |
std::complex data types: std::complexstd::complexstd::complex<int8_t>,std::complex<uint8_t>std::complex<int16_t>,std::complex<uint16_t>std::complex<int32_t>,std::complex<uint32_t>std::complex<int64_t>,std::complex<uint64_t> (since R2024a) |
Return Value
FutureResult | A FutureResult object used to get the result of calling the MATLAB function. |
---|
Examples
This example passes the scalar double 12.7 to the MATLABsqrt
function asynchronously. TheFutureResult
is then used to get the result.
#include "MatlabDataArray.hpp"
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::ArrayFactory factory;
matlab::data::Array argument = factory.createScalar<double>(12.7);
FutureResult<matlab::data::Array> future = matlabPtr->fevalAsync(u"sqrt", std::move(argument));
...
matlab::data::TypedArray<double> result = future.get();
eval
void eval(const matlab::engine::String &statement,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer> (),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer> ())
Description
Evaluate a MATLAB statement as a string synchronously.
Parameters
const matlab::engine::String &statement | MATLAB statement to evaluate |
---|---|
const std::shared_ptrmatlab::engine::StreamBuffer &output | Stream buffer used to store the standard output from the MATLAB statement. For an example, see Redirect Screen Output. |
const std::shared_ptrmatlab::engine::StreamBuffer &error | Stream buffer used to store the error message from the MATLAB command. For an example, see Redirect Error Output. |
Exceptions
matlab::engine::MATLABNotAvailableException | The MATLAB session is not available. |
---|---|
matlab::engine::MATLABExecutionException | There is a run-time error in the MATLAB statement. |
matlab::engine::MATLABSyntaxException | There is a syntax error in the MATLAB statement. |
Examples
This example evaluates the following MATLAB statement.
The statement creates the variable a
in the MATLAB base workspace.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlabPtr->eval(u"a = sqrt(12.7);");
evalAsync
FutureResult<void> evalAsync(const matlab::engine::String &str,
const std::shared_ptr<matlab::engine::StreamBuffer> &output = std::shared_ptr<matlab::engine::StreamBuffer> (),
const std::shared_ptr<matlab::engine::StreamBuffer> &error = std::shared_ptr<matlab::engine::StreamBuffer> ())
Description
Evaluate a MATLAB statement as a string asynchronously.
Parameters
const matlab::engine::String& str | MATLAB statement to evaluate |
---|---|
const std::shared_ptrmatlab::engine::StreamBuffer & output | Stream buffer used to store the standard output from the MATLAB statement. For an example, see Redirect Screen Output. |
const std::shared_ptrmatlab::engine::StreamBuffer & error | Stream buffer used to store the error message from the MATLAB command. For an example, see Redirect Error Output. |
Return Value
FutureResult | A FutureResult object used to wait for the completion of the MATLAB statement. |
---|
Examples
This example evaluates the following MATLAB statement asynchronously.
The statement creates the variable a
in the MATLAB base workspace.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
FutureResult<void> future = matlabPtr->evalAsync(u"a = sqrt(12.7);");
getVariable
matlab::data::Array getVariable(const matlab::engine::String &varName,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)
Description
Get a variable from the MATLAB base or global workspace.
Parameters
const matlab::engine::String& varName | Name of a variable in the MATLAB workspace. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
---|---|
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE | MATLAB workspace (BASE or GLOBAL) to get the variable from. For more information, see global. |
Return Value
matlab::data::Array | Variable obtained from the MATLAB base or global workspace |
---|
Exceptions
matlab::engine::MATLABNotAvailableException | The MATLAB session is not available. |
---|---|
matlab::engine::MATLABExecutionException | The requested variable does not exist in the specified MATLAB base or global workspace. |
Examples
This example gets a variable named varName
from the MATLAB base workspace.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::Array varName = matlabPtr->getVariable(u"varName");
getVariableAsync
FutureResult<matlab::data::Array> getVariableAsync(const matlab::engine::String &varName,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)
Description
Get a variable from the MATLAB base or global workspace asynchronously.
Parameters
const matlab::engine::String& varName | Name of the variable in MATLAB workspace. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
---|---|
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE | MATLAB workspace (BASE or GLOBAL) to get the variable from. For more information, see global. |
Return Value
FutureResult | A FutureResult object that you can use to get the variable obtained from the MATLAB workspace as amatlab.data.Array. |
---|
Examples
This example gets a variable named varName
from the MATLAB base workspace asynchronously.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
FutureResult<matlab::data::Array> future = matlabPtr->getVariableAsync(u"varName");
...
matlab::data::Array varName = future.get();
setVariable
void setVariable(const matlab::engine::String &varName,
const matlab::data::Array &var,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)
Description
Put a variable into the MATLAB base or global workspace. If a variable with the same name exists in the MATLAB workspace, setVariable
overwrites it.
Parameters
const matlab::engine::String& varName | Name of the variable to create in the MATLAB workspace. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
---|---|
const matlab::data::Array var | Value of the variable to create in the MATLAB workspace |
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE | Put the variable in the MATLAB BASE or GLOBAL workspace. For more information, seeglobal. |
Exceptions
matlab::engine::MATLABNotAvailableException | The MATLAB session is not available. |
---|
Examples
This example puts the variable named data
in the MATLAB base workspace.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::Array data = factory.createArray<double>({ 1, 3 }, { 4, 8, 6 });
matlabPtr->setVariable(u"data", data);
setVariableAsync
FutureResult<void> setVariableAsync(const matlab::engine::String &varName,
const matlab::data::Array var,
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE)
Description
Put a variable into the MATLAB base or global workspace asynchronously. If a variable with the same name exists in the MATLAB base workspace, setVariableAsync
overwrites it.
Parameters
const matlab::engine::String& varName | Name of the variable to create in the MATLAB workspace. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
---|---|
const matlab::data::Array var | Value of the variable to create in the MATLAB workspace |
matlab::engine::WorkspaceType workspaceType = matlab::engine::WorkspaceType::BASE | Put the variable in the MATLAB BASE or GLOBAL workspace. For more information, seeglobal. |
Example
This example puts the variable named data
in the MATLAB base workspace.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::Array data = factory.createArray<double>({ 1, 3 }, { 4., 8., 6. });
FutureResult<void> future = matlabPtr->setVariableAsync(u"data", data);
getProperty
matlab::data::Array getProperty(const matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName)
matlab::data::Array getProperty(const matlab::data::Array &object,
const matlab::engine::String &propertyName)
Description
Get the value of an object property. If the object input argument is an array of objects, specify the index of the array element that corresponds to the object whose property value you want to get.
Parameters
const matlab::data::Array &objectArray | Array of MATLAB objects |
---|---|
const matlab::data::Array &object | Scalar MATLAB object |
size_t index | Zero-based index into the object array, specifying the object in that array whose property value is returned |
const String &propertyName | Name of the property. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
Return Value
matlab::data::Array | Value of the named property |
---|
Exceptions
matlab::engine::MATLABNotAvailableException | The MATLAB session is not available. |
---|---|
matlab::engine::MATLABExecutionException | The property does not exist. |
Examples
This example evaluates a MATLAB statement in a try/catch block usingMATLABEngine::eval
. TheMATLABEngine::getVariable
member function returns the exception object. MATLABEngine::getProperty
returns the exceptionmessage
property value as amatlab::data::CharArray
.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlabPtr->eval(u"try; surf(4); catch me; end");
matlab::data::Array mException = matlabPtr->getVariable(u"me");
matlab::data::CharArray message = matlabPtr->getProperty(mException, u"message");
std::cout << "messages is: " << message.toAscii() << std::endl;
getPropertyAsync
FutureResult<matlab::data::Array> getPropertyAsync(const matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName)
FutureResult<matlab::data::Array> getPropertyAsync(const matlab::data::Array &object,
const matlab::engine::String &propertyName)
Description
Get the value of an object property asynchronously. If the object input argument is an array of objects, specify the index of the array element that corresponds to the object whose property value you want to get.
Parameters
const matlab::data::Array &objectArray | Array of MATLAB objects |
---|---|
const matlab::data::Array &object | Scalar MATLAB object |
size_t index | Zero-based index into the object array, specifying the object in that array whose property value is returned |
const matlab::engine::String &propertyName | Name of the property. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
Return Value
FutureResult | FutureResult object that is used to synchronize the operation. |
---|
Examples
This example evaluates a MATLAB statement in a try/catch block usingMATLABEngine::eval
. TheMATLABEngine::getVariable
member function returns the exception object. MATLABEngine::getPropertyAsync
returns aFutureResult
that you use to get the exceptionmessage
property value as amatlab::data::CharArray
.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlabPtr->eval(u"try;surf(4);catch me;end");
matlab::data::Array mException = matlabPtr->getVariable(u"me");
FutureResult<matlab::data::Array> future = matlabPtr->getPropertyAsync(mException, u"message");
matlab::data::CharArray message = future.get();
std::cout << "messages is: " << message.toAscii() << std::endl;
setProperty
void setProperty(matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)
void setProperty(matlab::data::Array &object,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)
Description
Set the value of an object property. If the object input argument is an array of objects, specify the index of the array element that corresponds to the object whose property value you want to set.
Parameters
matlab::data::Array &objectArray | Array of MATLAB objects |
---|---|
matlab::data::Array &object | Scalar MATLAB object |
size_t index | Zero-based index into the object array, specifying the object in that array whose property value is set |
const matlab::engine::String &propertyName | Name of the property to set. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
const matlab::data::Array &propertyValue | Value assigned to the property |
Exceptions
matlab::engine::MATLABNotAvailableException | The MATLAB session is not available. |
---|---|
matlab::engine::MATLABExecutionException | The property does not exist. |
Examples
This example shows how to set a MATLAB object property. It creates a MATLAB graph and returns the line handle object. Setting the value of the lineLineStyle
property to the character :
changes the property value of the line object in MATLAB and updates the line style of the graph.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::ArrayFactory factory;
matlab::data::Array yData = factory.createArray<double>({ 1, 5 }, { 4.0, 11.0, 4.7, 36.2, 72.3 });
matlab::data::Array lineHandle = matlabPtr->feval(u"plot", yData);
matlab::data::CharArray lineStyle = factory.createCharArray(":");
matlabPtr->setProperty(lineHandle, u"LineStyle", lineStyle);
setPropertyAsync
FutureResult<void> setPropertyAsync(matlab::data::Array &objectArray,
size_t index,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)
FutureResult<void> setPropertyAsync(matlab::data::Array &object,
const matlab::engine::String &propertyName,
const matlab::data::Array &propertyValue)
Description
Set the value of an object property asynchronously. If the object input argument is an array of objects, specify the index of the array element that corresponds to the object whose property value you want to set.
Parameters
matlab::data::Array &objectArray | Array of MATLAB objects |
---|---|
matlab::data::Array &object | Scalar MATLAB object |
size_t index | Zero-based index into the object array, specifying the object in that array whose property value is set |
const matlab::engine::String &propertyName | Name of the property to set. Specify the name as anstd::u16string. Also, you can specify this parameter as an std::string. |
const matlab::data::Array &propertyValue | Value assigned to the property. |
Examples
This example shows how to set a MATLAB object property asynchronously. It creates a MATLAB graph and returns the line handle object. Setting the lineLineStyle
property to the character :
changes the property value of the object in MATLAB and updates the line style of the graph.
#include "MatlabEngine.hpp"
using namespace matlab::engine;
std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB();
matlab::data::ArrayFactory factory;
matlab::data::Array yData = factory.createArray<double>({ 1, 5 }, { 4.0, 11.0, 4.7, 36.2, 72.3 });
matlab::data::Array lineHandle = matlabPtr->feval(u"plot", yData);
matlab::data::CharArray lineStyle = factory.createCharArray(":");
FutureResult<void> future = matlabPtr->setPropertyAsync(lineHandle, u"LineStyle", lineStyle);
Version History
Introduced in R2017b
Member functions feval and fevalAsync support native C++ string, std::vector
, andstd::complex
data types. For more information, see theRhsArgs&&... rhsArgs
entry in thefeval
and fevalAsync
Parameters tables.