由于所述问题,我被我的程序卡住了。当我在将计算值分配给数组之前或之后放置 printf 语句时,我得到了正确的答案。否则,这是一个奇怪的数字。不过这个数字非常一致。printf 不必包含与数组相关的任何内容。我检查了这个答案,但没有从中得到太多。以下是我的部分代码:
int xcorr(Imdata, Kernel, sizeIm, sizeKernel, result_im)
unsigned short** Imdata;
unsigned short** Kernel;
long sizeIm[2], sizeKernel[2];
float** result_im;
{
register float Imstd, Imavg, Kernelstd, Kernelavg, combine_avg, outtmp, area;
register int bufYsize, bufXsize;
int i,j,r,c;
register unsigned short *ImdataPtr, *KernelPtr;
register float *result;
register float val1, val2;
// kernel average and standard deviation are constant throughout this function
area = sizeKernel[0]*sizeKernel[1];
outtmp = Kernelavg = 0;
// Using the One-pass standard variance algorithm
for(i=0;i<sizeKernel[0];i++){
KernelPtr = Kernel[i];
for(j=0;j<sizeKernel[1];j++){
val1 = KernelPtr[j];
Kernelavg += val1;
outtmp += val1*val1;
}
}
Kernelavg /= area;
outtmp /= area;
// now the standard deviation
Kernelstd = sqrt(outtmp - Kernelavg*Kernelavg);
/////////////////////////////////////////////////
// Perform Correlation
/////////////////////////////////////////////////
bufYsize = sizeIm[0] - sizeKernel[0] + 1;
bufXsize = sizeIm[1] - sizeKernel[1] + 1;
for(i=0;i<bufYsize;i++){
result = result_im[i];
for(j=0;j<bufXsize;j++){
combine_avg = outtmp = Imavg = 0;
// Using one-pass method for standard variance:
for (r = 0; r < sizeKernel[0]; r++){
KernelPtr = Kernel[r];
ImdataPtr = Imdata[i+r];
for (c = 0; c < sizeKernel[1]; c++){
val1 = KernelPtr[c];
val2 = ImdataPtr[j+c];
Imavg += val2;
outtmp += val2*val2;
combine_avg += val1*val2;
}
}
outtmp /= area;
Imavg /= area;
// standard deviation
if((Imstd = outtmp - Imavg*Imavg)<=SMALL_VAR){
result[j] = 0;
continue;
}
Imstd = sqrt(outtmp - Imavg*Imavg);
combine_avg /= area;
result[j] = (float)combine_avg-(Imavg*Kernelavg))/(Kernelstd*Imstd);
}
}
return 0;
}
错误与结果有关,在 main 中分配如下:
result = (float**)malloc(bufYsize*sizeof(float*));
if(result == NULL){
printf("Error allocating the output array (pair num=%d)\n",k+1);
xit_status = 1; //exit(EXIT_FAILURE);
}
else{
for(i=0;i<bufYsize;i++){
result[i]=malloc(bufXsize*sizeof(float));
if(result[i]==NULL){
printf("Error allocating the output array at row %d, pair %d\n",i,k+1);
exit_status = 1; //exit(EXIT_FAILURE);
}
}
}