Как правильно сравнивать результаты между matlab / octave и C++


Я пишу некоторый фрагмент кода, доступный в Matlab / Octave, в код C++. У меня есть только Октава, поэтому я буду просто говорить Октава отныне. Я хочу правильно сравнить результаты между октавным кодом и кодом C++. Алгоритмы, которые я пишу, принимают в качестве входных данных двумерную матрицу и выводят другую двумерную матрицу.

Чтобы сравнить результаты, я пишу входную матрицу A из октавы, используя функцию save A.mat A, с параметрами по умолчанию. Это создает ascii-файл A. mat, который запускается как

# Created by Octave 3.8.1, Tue May 27 12:12:53 2014 CEST <remi@desktop>
# name: values
# type: matrix
# rows: 25
# columns: 5 
43.0656 6.752420000000001 68.39323 35.75617 98.85446
...

Я запускаю алгоритм с использованием октавы и сохраняю выходную матрицу B аналогичным образом.

В моем коде C++ я загружаю матрицы A и B, используя следующий фрагмент кода:

// I opened the file A.mat with std::ifstream infile(filename);
// and read the first lines starting by # and loaded the matrix dimensions
std::string buffer;
double* matBuffer = new double[rows*cols];
while (std::getline(infile, buffer)) {
  std::istringstream iss(buffer);
  while (iss >> *matBuffer) {
    matBuffer++;
  }
}
Затем я запускаю код C++ со значениями, считанными из A. mat, и сравниваю результаты со значениями, считанными из B. mat, вычисляя среднеквадратичную ошибку(MSE) на коэффициенте B read vs B computed.

Однако, с таким дизайном, могу ли я ожидать, что MSE будет 0 между C++ а октавный код? Конечно, я делаю вычисления на octave и C++ с помощью одной и той же машины. Но как насчет потери точности из-за записи/чтения матриц в файлах? Кроме того, я предполагаю, что коэффициенты октавных матриц по умолчанию хранятся в double, правильно ли это?

1 2

1 ответ:

Могу ли я ожидать, что MSE будет 0 между кодом C++ и октавой?

Я так не думаю, потому что из-за многих уровней преобразования трудно избежать потери точности.

Кроме того, я предполагаю, что коэффициенты октавных матриц хранятся в двойном по умолчанию, правильно ли это?

Октава использует двойную точность для внутреннего представления значений, но опять же может быть потеря точности при хранении значений в ФОРМАТ ASCII.

Я бы предложил вам попробовать использовать двоичный формат для хранения значений, что исключит любые проблемы с точностью. Вы можете перейти к формату HDF5, используя

save -hdf5 A.mat A

Затем вы можете использовать HDF5 API для чтения значений в вашем CPP-приложении.