MATLAB® отображает сообщения об ошибке и выход от операторов в окне команды MATLAB. Чтобы перенаправить этот выход к вашей программе C++, используйте буфер строки, чтобы получить этот выход и возвратить его с feval, fevalAsync, eval или evalAsync функцией членства.
Для получения информации о том, как установить и создать программы механизма C++, видит Сборку Программы Engine C++.
Этот пример кода оценивает два оператора в MATLAB. Эти операторы создают три переменные в рабочем пространстве MATLAB. Код вызывает MATLAB whos
функция, которая отображает текущие переменные рабочей области в окне команды MATLAB. Получите стандартный вывод MATLAB в буфере строки путем передачи указателя на буфер с вызовом MATLABEngine::eval
.
#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp" #include <iostream>
void screenOutput() { using namespace matlab::engine; // Start MATLAB engine synchronously std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB(); // Evaluate statements that create variables matlabPtr->eval(u"[X,Y] = meshgrid(-2:.2:2);"); matlabPtr->eval(u"Z = X.*exp(-X.^2 - Y.^2);"); // Create MATLAB data array factory matlab::data::ArrayFactory factory; // Create string buffer for standard output typedef std::basic_stringbuf<char16_t> StringBuf; std::shared_ptr<StringBuf> output = std::make_shared<StringBuf>(); // Display variables in the MATLAB workspace matlabPtr->eval(u"whos", output); // Display MATLAB output in C++ String output_ = output.get()->str(); std::cout << convertUTF16StringToUTF8String(output_) << std::endl; }
Этот пример кода вызывает ошибку MATLAB путем ссылки на переменную после очищения всех переменных из рабочего пространства MATLAB. Буфер строки передал MATLABEngine::eval
функция членства получает сообщение об ошибке в блоке попытки/выгоды кода.
#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp" #include <iostream>
void errorOutput() { using namespace matlab::engine; // Start MATLAB engine synchronously std::unique_ptr<MATLABEngine> matlabPtr = startMATLAB(); // Create MATLAB data array factory matlab::data::ArrayFactory factory; // Create string buffer for standard output typedef std::basic_stringbuf<char16_t> StringBuf; std::shared_ptr<StringBuf> error = std::make_shared<StringBuf>(); // Evaluate statement that causes error matlabPtr->eval(u"clear"); try { matlabPtr->eval(u"x + 2;", {}, error); } catch (...) { String error_ = error.get()->str(); std::cout << convertUTF16StringToUTF8String(error_) << std::endl; } }
matlab::data::ArrayFactory
| matlab::engine::convertUTF16StringToUTF8String
| matlab::engine::MATLABEngine
| matlab::engine::startMATLAB