Оцените функции MATLAB из программы C++
The matlab::engine::MATLABEngine
класс использует MATLAB® процесс как вычислительный механизм для C++. Этот класс предоставляет интерфейс между языком C++ и MATLAB, что позволяет вам вычислять функции MATLAB и выражения из программ C++.
Пространство имен: | matlab::engine |
Включите: | MatlabEngine.hpp |
The matlab::engine::MATLABEngine
класс предоставляет методы для запуска MATLAB и для синхронного или асинхронного подключения к общему сеансу работы с MATLAB.
matlab::engine::startMATLAB
- Запуск MATLAB синхронно
matlab::engine::startMATLABAsync
- Запуск MATLAB асинхронно
matlab::engine::connectMATLAB
- Синхронное подключение к общему сеансу работы с MATLAB
matlab::engine::connectMATLABAsync
- Соединиться с общим сеансом работы с MATLAB асинхронно
Движок не поддерживает следующие опции запуска MATLAB:
-h
-help
-?
-n
-e
-softwareopengl
-logfile
Для получения информации об опциях запуска MATLAB, см. «Обычно используемые опции запуска». Пример использования опций запуска MATLAB при запуске приложений Engine см. в Start MATLAB с опциями запуска.
Вычислите функцию MATLAB с аргументами синхронно | |
Вычислите функцию MATLAB с аргументами асинхронно | |
Выполняйте выражение MATLAB как строку синхронно | |
Выполняйте выражение MATLAB как строку асинхронно | |
Получите переменную из базового рабочего пространства MATLAB синхронно | |
Получите переменную из базового рабочего пространства MATLAB асинхронно | |
Поместите переменную в базовое рабочее пространство MATLAB синхронно | |
Поместите переменную в базовое рабочее пространство MATLAB асинхронно | |
Получите значение свойства объекта | |
Получите значение свойства объекта асинхронно | |
Установите значение свойства объекта | |
Задайте значение свойства объекта асинхронно |
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)
Выполняйте функции MATLAB с входными параметрами синхронно. Используйте feval, когда вы хотите передать аргументы из C++ в MATLAB и когда вы хотите вернуть результат из MATLAB в C++.
Входы и выходы могут быть типами, заданными MATLAB Data Array API или могут быть собственными типами C++.
| Имя функции MATLAB или скрипта для оценки. Задайте имя как |
|
Количество возвращенных значений |
| Несколько входных параметров для передачи в функцию MATLAB в |
|
Один входной параметр для передачи в функцию MATLAB. |
|
Буфер потока, используемый для хранения стандартного выхода из функции MATLAB. |
|
Буфер потока, используемый для хранения сообщения об ошибке от функции MATLAB. |
|
Нативные типы данных C++, используемые для входных параметров функции. |
|
Выходы, возвращенные от функции MATLAB. |
|
Один выход возвращен из функции MATLAB. |
| Выход, возвращенный из функции MATLAB как заданный пользователем тип. Может быть |
|
Этот Сеанс работы с MATLAB недоступен. |
|
В функции есть ошибка во время выполнения MATLAB. |
|
Результат функции MATLAB не может быть преобразован в заданный тип. |
|
В функции MATLAB имеется синтаксическая ошибка. |
Этот пример передает массив числовых значений в функцию MATLAB. Код выполняет следующие шаги:
Создает matlab::data::Array
с размерностями 2 на 3 из вектора числовых значений типа double.
Запускает общий сеанс работы с MATLAB.
Передает массив данных в MATLAB sqrt
функция и возвращает результат к 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);
При вызове feval
используя собственные типы C++, входные параметры ограничены скалярными значениями. Для примера этот код возвращает квадратный корень скалярного значения.
#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));
Для функций, которые возвращают несколько выходных аргументов, можно использовать MATLAB data API или, если используется тип C++, std::tuple
. Для получения примера смотрите Функцию вызова с собственными типами 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)
Вычислите функцию MATLAB с входными параметрами и возвращенными значениями асинхронно.
| Имя функции MATLAB или скрипта для оценки. Задайте имя как |
|
Количество возвращенных значений |
| Несколько входных параметров для передачи в функцию MATLAB в |
|
Один входной параметр для передачи в функцию MATLAB. |
|
Буфер потока, используемый для хранения стандартного выхода из функции MATLAB. |
|
Буфер потока, используемый для хранения сообщения об ошибке от функции MATLAB. |
|
Нативные типы данных C++, используемые для входных параметров функции. |
|
A |
Ничего
Этот пример передает скалярный двойной коэффициент 12,7 в MATLAB sqrt
функция асинхронно. The FutureResult
затем используется, чтобы получить результат.
#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> ())
Рассчитать выражение MATLAB как строку синхронно.
|
Выражение MATLAB для оценки |
|
Буфер потока, используемый для хранения стандартных выходов из выражения MATLAB. |
|
Буфер потока, используемый для хранения сообщения об ошибке от команды MATLAB. |
|
Этот Сеанс работы с MATLAB недоступен. |
|
В выражении MATLAB произошла ошибка во время выполнения. |
|
Синтаксическая ошибка в выражении MATLAB. |
В этом примере оценивается следующее выражение MATLAB.
a = sqrt(12.7);
Оператор создает переменную a
в базовом рабочем пространстве MATLAB.
#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> ())
Рассчитать выражение MATLAB как строку асинхронно.
|
Выражение MATLAB для оценки |
|
Буфер потока, используемый для хранения стандартных выходов из выражения MATLAB. |
|
Буфер потока, используемый для хранения сообщения об ошибке от команды MATLAB. |
|
A |
Ничего
Этот пример асинхронно оценивает следующее выражение MATLAB.
a = sqrt(12.7);
Оператор создает переменную a
в базовом рабочем пространстве MATLAB.
#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)
Получите переменную из основы MATLAB или глобальной рабочей области.
| Имя переменной в рабочем пространстве MATLAB. Задайте имя как |
|
Рабочее пространство MATLAB (BASE или GLOBAL), из которого можно получить переменную. Для получения дополнительной информации см. |
|
Переменная, полученная из основы MATLAB или глобальной рабочей области |
|
Этот Сеанс работы с MATLAB недоступен. |
|
Запрошенная переменная не существует в указанной основе MATLAB или глобальной рабочей области. |
Этот пример получает переменную с именем varName
из базового рабочего пространства MATLAB.
#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)
Получите переменную из основы MATLAB или глобальной рабочей области асинхронно.
| Имя переменной в рабочем пространстве MATLAB. Задайте имя как |
|
Рабочее пространство MATLAB (BASE или GLOBAL), из которого можно получить переменную. Для получения дополнительной информации см. |
|
A |
Ничего
Этот пример получает переменную с именем varName
из базового рабочего пространства MATLAB асинхронно.
#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)
Поместите переменную в основу MATLAB или глобальную рабочую область. Если переменная с таким же именем существует в рабочем пространстве MATLAB, setVariable
перезаписывает его.
| Имя переменной, созданной в рабочем пространстве MATLAB. Задайте имя как |
|
Значение переменной, которую нужно создать в рабочем пространстве MATLAB |
|
Поместите переменную в рабочую область MATLAB BASE или GLOBAL. Для получения дополнительной информации см. |
|
Этот Сеанс работы с MATLAB недоступен. |
Этот пример помещает переменную с именем data
в базовом рабочем пространстве MATLAB.
#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)
Поместите переменную в основу MATLAB или глобальную рабочую область асинхронно. Если переменная с таким же именем существует в базовом рабочем пространстве MATLAB, setVariableAsync
перезаписывает его.
| Имя переменной, созданной в рабочем пространстве MATLAB. Задайте имя как |
|
Значение переменной, которую нужно создать в рабочем пространстве MATLAB |
|
Поместите переменную в рабочую область MATLAB BASE или GLOBAL. Для получения дополнительной информации см. |
Ничего
Этот пример помещает переменную с именем data
в базовом рабочем пространстве MATLAB.
#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)
Получите значение свойства объекта. Если входной параметр объекта является массивом объектов, задайте индекс элемента массива, который соответствует объекту, значение свойства которого вы хотите получить.
| Массив объектов MATLAB |
| Скалярный объект MATLAB |
| Нулевой индекс в объектный массив, задающий объект в этом массиве, значение свойства которого возвращается |
| Имя свойства. Задайте имя как |
|
Значение именованного свойства |
|
Этот Сеанс работы с MATLAB недоступен. |
|
Свойство не существует. |
Этот пример оценивает выражение MATLAB в блоке try/catch, используя MATLABEngine::eval
. The MATLABEngine::getVariable
Функция member возвращает объект исключения. MATLABEngine::getProperty
возвращает исключение message
значение свойства как matlab::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)
Получите значение свойства объекта асинхронно. Если входной параметр объекта является массивом объектов, задайте индекс элемента массива, который соответствует объекту, значение свойства которого вы хотите получить.
| Массив объектов MATLAB |
| Скалярный объект MATLAB |
| Нулевой индекс в объектный массив, задающий объект в этом массиве, значение свойства которого возвращается |
| Имя свойства. Задайте имя как |
|
|
Ничего
Этот пример оценивает выражение MATLAB в блоке try/catch, используя MATLABEngine::eval
. The MATLABEngine::getVariable
Функция member возвращает объект исключения. MATLABEngine::getPropertyAsync
возвращает FutureResult
который используется для получения исключения message
значение свойства как matlab::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)
Установите значение свойства объекта. Если входной параметр объекта является массивом объектов, задайте индекс элемента массива, который соответствует объекту, значение свойства которого вы хотите задать.
| Массив объектов MATLAB |
| Скалярный объект MATLAB |
| Нулевой индекс в объектный массив, задающий объект в этом массиве, значение свойства которого задано |
| Имя свойства, которое нужно задать. Задайте имя как |
const matlab::data::Array &propertyValue |
Значение, присвоенное свойству |
|
Этот Сеанс работы с MATLAB недоступен. |
|
Свойство не существует. |
В этом примере показано, как задать свойство объекта MATLAB. Он создает графиков MATLAB и возвращает объект указателя на линию. Установка значения линии LineStyle
свойство для символа :
изменяет значение свойства объекта линии в MATLAB и обновляет стиль линии графика.
#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)
Установите значение свойства объекта асинхронно. Если входной параметр объекта является массивом объектов, задайте индекс элемента массива, который соответствует объекту, значение свойства которого вы хотите задать.
| Массив объектов MATLAB |
| Скалярный объект MATLAB |
| Нулевой индекс в объектный массив, задающий объект в этом массиве, значение свойства которого задано |
| Имя свойства, которое нужно задать. Задайте имя как |
const matlab::data::Array &propertyValue |
Значение, присвоенное свойству. |
Ничего
В этом примере показано, как задать свойство объекта MATLAB асинхронно. Он создает графиков MATLAB и возвращает объект указателя на линию. Установка линии LineStyle
свойство для символа :
изменяет значение свойства объекта в MATLAB и обновляет стиль линии графика.
#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);