Оцените функции 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 асинхронно | |
|
Получите значение свойства объекта | |
|
Получите значение свойства объекта асинхронно | |
|
Установите значение свойства объекта | |
|
Задайте значение свойства объекта асинхронно |
fevalstd::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++.
fevalAsyncFutureResult<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();evalvoid 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);");
evalAsyncFutureResult<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);");
getVariablematlab::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");
getVariableAsyncFutureResult<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();
setVariablevoid 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);setVariableAsyncFutureResult<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);getPropertymatlab::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;
getPropertyAsyncFutureResult<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;
setPropertyvoid 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);setPropertyAsyncFutureResult<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);