Анализ функций MATLAB из программы C++
matlab::engine::MATLABEngine класс использует процесс MATLAB ® в качестве вычислительного механизма для C++. Этот класс обеспечивает интерфейс между языком C++ и MATLAB, позволяя вычислять функции и выражения MATLAB из программ C++.
|
Пространство имен: | matlab::engine |
| Включить: | MatlabEngine.hpp |
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 при запуске приложений ядра см. в разделе Запуск 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++.
Входы и выходы могут быть типами, определенными API MATLAB Data Array, или могут быть собственными типами 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));Для функций, возвращающих несколько выходных аргументов, можно использовать API данных MATLAB или, при использовании типов 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 асинхронно. 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. MATLABEngine::getVariable функция-член возвращает объект исключения. 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. MATLABEngine::getVariable функция-член возвращает объект исключения. 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);