Чтение созданного MATLAB netCDF-файла с C-кодом дает неверные данные

Я создал nc-файл в MATLAB со следующими свойствами:

  • Формат: netcdf4_classic
  • Размеры: xPx = 256, yPx = 256, polCoeff = 5
  • Переменные: IntLinCorr
  • Размер: 256x256x5
  • Размеры: xPx, yPx, polCoeff
  • Тип данных: двойной

Я прочитал файл в MATLAB и проверил, что он правильный.

Теперь я хочу прочитать файл на C ++, используя Microsoft Visual Studio 10. Я установил библиотеку netCDF 4.4.0 C. Это мой фрагмент кода:

std::shared_ptr<CImg<double>> GUIModImag::doIntLinCorrection(std::shared_ptr<CImg<double>> image){
//image is an image of size 256x256

// We are reading 3D data, a xPx x yPx x pNum grid.
static const int xPx = image->width(); //image width
static const int yPx = image->height(); //image height
static const int pNum = 5; //Number of coefficients from polynom fit
// This will be the netCDF ID for the file and data variable.
int nc_id, retval, var_id;

// Path of the used files
std::string fileName(QString("...."));

// This is the array we will read.
std::unique_ptr<double> dataIn(new double[xPx*yPx*pNum]);

// Open the file for read access (NC_NOWRITE)
if ((retval = nc_open(fileName.c_str(), NC_NOWRITE, &nc_id)))
ERR(retval); // Makro for ERRORS

// Get the variable id of the data variable, based on its name
if ((retval = nc_inq_varid(nc_id, "IntLinCorr", &var_id)))
ERR(retval);

// Read the data
if ((retval = nc_get_var_double(nc_id, var_id, &(dataIn.get()[0*0*0]))))
ERR(retval);

// Work with data

double* p_FirstPixelImage = &(image->front());

for (int y=0; y<yPx; y++){
for (int x=0; x<xPx; x++){

*(p_FirstPixelImage+x+y)= dataIn.get()[x*y*0] * pow(*(p_FirstPixelImage+x+y),4)
+ dataIn.get()[x*y*1] * pow(*(p_FirstPixelImage+x+y),3)
+ dataIn.get()[x*y*2] * pow(*(p_FirstPixelImage+x+y),2)
+ dataIn.get()[x*y*3] * pow(*(p_FirstPixelImage+x+y),1)
+ dataIn.get()[x*y*4];
}
}

return image;

// Close the file, freeing all resources.
if ((retval = nc_close(nc_id)))
ERR(retval);

}

В принципе код работает нормально, ошибок не возникает. Тем не менее, данные, которые я прочитал с

dataIn.get()[x*y*0]

это не то же самое, что я записал в nc-файл. Фактически, двойные значения, которые я прочитал, находятся в диапазоне e-20, в то время как записанные мной данные находятся в диапазоне от e-18 до e-0.

Я предполагаю, что у меня могут быть проблемы с форматом netCDF.

У кого-нибудь есть идеи, что я могу сделать, чтобы правильно прочитать данные?

Большое спасибо!

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]