Как сравнить результаты между C ++ и MATLAB?

У меня есть программа, которая обрабатывает массив двойных чисел на нескольких этапах. Я хочу сравнить его результаты с MATLAB. Возможно, я могу использовать std :: cout, чтобы напечатать некоторые из блоков размером 8×8 2D-массив до и после обработки (алгоритм работает с блоками) на консоли, а затем вручную ввести эти числа в MATLAB. Но это склонно к ошибкам и тедиям. Есть ли способ получить эти данные в MATLAB?

Matlab имеет встроенные функции для упрощения многих вещей. Я хочу получить данные до и после обработки в программе C ++ в MATLAB, а затем выполнить некоторые проверки, например, нарисовать графики и прочее. Как мне получить данные из программы на C ++ в MATLAB?

2

Решение

Рассматривали ли вы использование мекс-функций? Если вы используете их, я настоятельно рекомендую использовать броненосец библиотека, которая предоставляет удобные типы данных и методы для переключения между MATLAB и C ++.

Например,

#include "mex.h"#include <armadillo>
#include "armaMex.hpp"#include <sstream>

// gateway function
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
// get data from MATLAB
mat X = conv_to<mat>::from(armaGetPr(prhs[0],true));
mat Y = conv_to<mat>::from(armaGetPr(prhs[1],true));

// do some stuff
mat Z = X + Y;

// Print data in matlab
std::ostringstream buffer;
buffer << "X = " << X << endl;
buffer << "Y = " << Y << endl;
buffer << "Z = " << Z << endl;
mexPrintf("%s", buffer.str().c_str());

// send data back to Matlab
plhs[0] = armaCreateMxMatrix(Z.n_rows, Z.n_cols, mxDOUBLE_CLASS, mxREAL);
armaSetPr(plhs[0], conv_to<mat>::from(Z));

return;
}
3

Другие решения

Очень просто получить числовые данные из программы на C ++ в Matlab. Просто выведите числа в виде ascii текста в файл, затем прочитайте его, используя load Разделяйте каждое число в столбце пробелом, а каждую строку — новой строкой.

Давайте возьмем 3 строки по 2 числа в качестве примера и скажем, что вы создаете файл «text.txt», который выглядит следующим образом:

1 2
3 4
5 6

Затем в Matlab команда:

 load text.txt

будет читать данные в переменную с именем text это матрица 3х2.

1

Кроме того, вы можете сделать небольшой вывод и напрямую записать в работающий .m файл (я использую этот подход для получения чисел в документах LaTeX). Преимущество этого подхода заключается в том, что вы можете определить несколько переменных MATLAB в одном файле. Например:

#include <fstream>

int main() {
std::ofstream file;
file.open ("cpp_output.m");
file << "out = [\n";
for (double x = 1; x<6; x++) {
file << x << ' ' << 1/(x*x) << '\n';
}
file << "];";
file.close();
}

производит файл cpp_output.m

out = [
1 1
2 0.25
3 0.111111
4 0.0625
5 0.04
];

Вы, вероятно, хотите изменить точность (например, Как вывести двойное значение с полной точностью, используя cout?)

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector