MATLAB ® отображает сообщения об ошибках и выходные данные операторов в окне команд MATLAB. Чтобы перенаправить этот вывод в программу C++, используйте строковый буфер, чтобы захватить этот вывод и вернуть его с помощью функции-члена feval, fevalAsync, eval или evalAsync.
Сведения о настройке и сборке программ ядра C++ см. в разделе Сборка программ ядра 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 функция-член фиксирует сообщение об ошибке в блоке кода try/catch.
#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