현재 공간 자동 상관 알고리즘을 사용하여 이미지의 패턴을 분석하는 프로그램에서 작업 중입니다. 0에서 2 사이의 값을 반환해야합니다. 코드를 실행할 때 0 값을 얻지 만 나머지는 수십억에 이릅니다 (음수와 양수 모두). 나는 내 수학과 어딘가에 잘못 갔다고 생각하지만, 나는 그것을 알아낼 수 없었다. 아래는 내가 사용하고있는 알고리즘 (Geary 's C, Geary 's Coefficient)과 내가 작업 해 온 코드에 대한 링크입니다.Geary 's Coefficient 알고리즘에 대한 잘못된 결과 얻기 (잘못된 수학?)
http://faculty.salisbury.edu/~ajlembo/419/lecture15.pdf
/*
CREATING WEIGHT MATRIX (QUEEN'S CASE)
*/
int wSize = 3;
int wHalf = (wSize - 1)/2;
double weight[3][3] = {{1,1,1},{1,1,1},{1,1,1}};
cout << "test2" << endl;
/*
APPLYING WEIGHT SUM FOR (NAME OF FUNCTION)
*/
unsigned char* c = new unsigned char[pixels*3];
cout << "test3" << endl;
for (int j = 0; j < columns; j++) {
for (int i = 0; i < lines; i++) {
int index = (i * lines + j) * 3;
double sum1R = 0, sum1G = 0, sum1B = 0;
double sum2R = 0, sum2G = 0, sum2B = 0;
double weightsum = 9;
for (int l = 0; l < wSize; l++) {
for (int k = 0; k < wSize; k++) {
int tempk = (k+j) - wHalf;
int templ = (l+i) - wHalf;
// making sure we are not out of bounds of the image
if((tempk > (columns - 1)) || (tempk < 0)){
tempk = j;
}
if((templ > (lines - 1)) || (templ < 0)){
templ = i;
}
int pos1 = (tempk*lines + 0) * 3;
int pos2 = (0 + templ) * 3;
int r1 = originalpixmap[pos1], g1 = originalpixmap[pos1+1], b1 = originalpixmap[pos1+2];
int r2 = originalpixmap[pos2], g2 = originalpixmap[pos2+1], b2 = originalpixmap[pos2+2];
sum1R += (weight[tempk][templ])*pow((r1-r2),2);
sum1G += (weight[tempk][templ])*pow((g1-g2),2);
sum1B += (weight[tempk][templ])*pow((b1-b2),2);
}
}
double meanSumR = 0, meanSumG = 0, meanSumB = 0;
for(int l = 0; l < wSize; l++){
int templ = (l+i) - wHalf;
int pos = (0 + templ) * 3;
if((templ > (lines - 1)) || (templ < 0)){
templ = i;
}
int r = originalpixmap[pos], g = originalpixmap[pos+1], b = originalpixmap[pos+2];
meanSumR += r;
meanSumG += g;
meanSumB += b;
}
double meanR = meanSumR/wSize;
double meanG = meanSumG/wSize;
double meanB = meanSumB/wSize;
for(int l = 0; l < wSize; l++){
int templ = (l+i) - wHalf;
int pos = (0 + templ) * 3;
if((templ > (lines - 1)) || (templ < 0)){
templ = i;
}
int r = originalpixmap[pos], g = originalpixmap[pos+1], b = originalpixmap[pos+2];
sum2R += pow((r-meanR),2);
sum2G += pow((g-meanG),2);
sum2B += pow((b-meanB),2);
}
double rval = ((pixels-1)/2)*((sum1R)/(weightsum*sum2R));
double gval = ((pixels-1)/2)*((sum1G)/(weightsum*sum2G));
double bval = ((pixels-1)/2)*((sum1B)/(weightsum*sum2B));
c[index] = (int)rval;
c[index+1] = (int)gval;
c[index+2] = (int)bval;
cout<< "C.r: " << rval <<" C.g: "<< gval <<" C.b: " << bval << endl;
}
}
}
디버거 사용에는 어떤 것이 있습니까? 이것이 잘못된 곳을 찾는 방법입니다 - 디버거를 사용하십시오. – PaulMcKenzie
저는 실제로 디버거를 사용하는 방법을 정확히 알지 못합니다.이 클래스보다 먼저 코딩 경험을 한 적이 없었습니다. 코드를 컴파일 할 때 오류가 없었지만 반환 된 값은 있어야하는 것이 아닙니다. –
어떤 컴파일러를 사용하고 있습니까? Visual Studio라면 디버거는'Debug' 메뉴를 사용하는 것만큼이나 쉽습니다. gcc이면 gdb가 디버거입니다. 요점은 무역 도구에 익숙하지 않으면 장난감 프로그램 이외에 아무것도 쓸 수 없다는 것입니다. – PaulMcKenzie