MEX-функции могут отобразить вывод в командном окне MATLAB®. Однако некоторые компиляторы не поддерживают использование std::cout
в MEX-функциях.
Другой подход должен использовать std::ostringstream
и функцию fprintf
MATLAB, чтобы отобразить текст в окне команды MATLAB.
Следующая MEX-функция просто возвращает текст и числовые значения, которые являются передачей в функцию как входные параметры. Аргументы приняты, чтобы быть char
и double
. Проверка ошибок не использована для простоты.
Вот то, как MEX-функция отображает текст в окне команды MATLAB:
Создайте экземпляр std::ostringstream
по имени stream
.
Вставьте данные, чтобы отобразиться в stream
.
Вызовите displayOnMATLAB
с объектом stream
.
Функция членства displayOnMATLAB
передает потоковое содержимое fprintf
и затем очищает потоковый буфер. Можно снова использовать объект stream
для последующих вызовов displayOnMATLAB
.
#include "mex.hpp" #include "mexAdapter.hpp" using matlab::mex::ArgumentList; using namespace matlab::data; class MexFunction : public matlab::mex::Function { // Pointer to MATLAB engine to call fprintf std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine(); // Factory to create MATLAB data arrays ArrayFactory factory; // Create an output stream std::ostringstream stream; public: void operator()(ArgumentList outputs, ArgumentList inputs) { const CharArray name = inputs[0]; const TypedArray<double> number = inputs[1]; stream << "Here is the name/value pair that you entered." << std::endl; displayOnMATLAB(stream); stream << name.toAscii() << ": " << double(number[0]) << std::endl; displayOnMATLAB(stream); } void displayOnMATLAB(std::ostringstream& stream) { // Pass stream content to MATLAB fprintf function matlabPtr->feval(u"fprintf", 0, std::vector<Array>({ factory.createScalar(stream.str()) })); // Clear stream buffer stream.str(""); } };
Вызов MEX-функции (названный streamOutput.cpp
в этом примере) из MATLAB приводит к следующему результату.
mex streamOutput.cpp streamOutput('Total',153)
Here is the name/value pair that you entered. Total: 153
matlab::data::ArrayFactory
| mATLABEngine:: MATLABEngine::