最近在写点程序,计算相关系数时,和ENVI差别很大,本来以为ENVI做了特别处理,后来拿我以前写的软件算也是和ENVI一样,这把我搞蒙了。
主要用GDAL读图像,然后用模板的方法写处理函数,T1,T2表示数据的数据类型可为char,unsigned int ,int,float,double等。
template<class T1,class T2> double cof3(int bandx,int bandy,GDALDataset*pDataSet,void*pData) { .... double x2sum=0; double y2sum=0; //图像读取 T1 *xBuffer=new T1[nw*READROW]; T2 *yBuffer=new T2[nw*READROW]; pDataSet->GetRasterBand(bandx)->RasterIO(GF_Read,nxOff,nyOff,nw,READROW,(void*)xBuffer,nw,READROW,xDataType,0,0); pDataSet->GetRasterBand(bandy)->RasterIO(GF_Read,nxOff,nyOff,nw,READROW,(void*)yBuffer,nw,READROW,yDataType,0,0); ...
x2sum+=xBuffer[i*nw+j]*xBuffer[i*nw+j]; y2sum+=yBuffer[i*nw+j]*yBuffer[i*nw+j]; .... }
到这里如果你能发觉问题,那回一下贴让我知道啊,哈哈,那就说明你C++功底扎实。
问题在哪里呢?
假如x波段和y波段的数据类型都是GDT_UInt16的,而且xBuffer[i*nw+j]=65535,yBuffer[i*nw+j]=65535,那么x2sum=y2sum=-131071
为什么?
因为两个unsigned int相乘还是unsigned int,但是65535*65535已经超出unsigned int的表示范围了,所以成了负数。
解决方法呢?
写出下面这样就行了
x2sum+=xBuffer[i*nw+j]*(double)xBuffer[i*nw+j]; y2sum+=yBuffer[i*nw+j]*(double)yBuffer[i*nw+j];
所以写两个整数的乘法时,要特别注意,一不小心就会越界。