Я создал nc-файл в MATLAB со следующими свойствами:
Я прочитал файл в 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.
У кого-нибудь есть идеи, что я могу сделать, чтобы правильно прочитать данные?
Большое спасибо!
Задача ещё не решена.
Других решений пока нет …