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:: feval