2017-09-22 2 views
0

Ich habe den folgenden Code, der die Jaccard-Ähnlichkeit zwischen einem Eingang char array und einem vorhandenen Array von Char-Arrays korrekt berechnet. jacc_sim_rec[] wird verwendet, um die Ähnlichkeiten aufzuzeichnen, die einen minimalen Schwellenwert erfüllen. Die for-Schleife wird verwendet, durch das mehrdimensionale Array zu durchlaufen und die Schleife sollte die Überprüfung Ähnlichkeit fortzusetzen, wenn Mindestschwelle notiert haupt nicht zufrieden if (jacc_sim < SIM_THRESHOLD); sonst das Ergebnis beiWarum wird dieser Else-Block zweimal ausgeführt?

else 
    { 
     jacc_sim_rec[j] = jacc_sim;//keep record of similarity 
     ++j;//record number of highly similar elements 
    } 

mein Problem ist, die ganzen Aussagen in den else Der Block wird jedes Mal zweimal ausgeführt, wenn der Schwellenwert erfüllt ist.

int j=0; 

void calc_jac_sim(char*INCOMING, int grp) 
{ 
    unsigned long i, j11 = 0, j01 = 0, j10 = 0,m=0; 
    char *m11, *m01, *m10; 
    float jacc_sim = 0.0; 
    char r1[SBF_LEN] = { NULL }; 
    char r2[SBF_LEN] = { NULL }; 
    char r3[SBF_LEN] = { NULL }; 
    int cnt = SBF_LEN - 1; 

    clear_jacc_sim_info(); 

    for (int i = 0; i <= SBF_REC[grp]; ++i) 
    { 
     while (cnt >= 0) 
     { 
      r1[cnt] = SBF[grp][i][cnt] & INCOMING[cnt]; 
      r2[cnt] = ~SBF[grp][i][cnt] & INCOMING[cnt]; 
      r3[cnt] = SBF[grp][i][cnt] & ~INCOMING[cnt]; 
      cnt--; 
     } 
     m11 = (char*)r1; 
     m01 = (char*)r2; 
     m10 = (char*)r3; 

     for (m = SBF_LEN * sizeof(char); m--; 
      j11 += NumberOfSetBits(*m11++), 
       j01 += NumberOfSetBits(*m01++), 
       j10 += NumberOfSetBits(*m10++)); 

     jacc_sim = j11/(float)(j11 + j01 + j10); 

     if (jacc_sim < SIM_THRESHOLD); 
     //continue;//do nothing 
     else 
     { 
      jacc_sim_rec[j] = jacc_sim;//keep record of similarity 
      ++j;//record number of highly similar elements 
     } 
    } 

} 
+1

Was lässt Sie glauben, dass es zweimal in derselben Iteration passiert, nicht nur in zwei verschiedenen Iterationen? – Barmar

+0

Statt 'if (jacc_sim = SIM_THRESHOLD) {...} ' – Barmar

+1

Ich habe es debuggt @Barmar – George

Antwort

1

ich den Code nicht verstehen, aber ich werde das Problem Wette ist, dass Sie cnt jedes Mal durch die for Schleife nicht sind neu initialisiert, so dass Sie nur in r1 füllen, r2 und r3 wenn i = 0 .

ändern, die Schleife zu:

for (int cnt = SBF_LEN - 1; cnt >= 0; cnt--) 
    { 
     r1[cnt] = SBF[grp][i][cnt] & INCOMING[cnt]; 
     r2[cnt] = ~SBF[grp][i][cnt] & INCOMING[cnt]; 
     r3[cnt] = SBF[grp][i][cnt] & ~INCOMING[cnt]; 
    } 

Ich bin auch nicht sicher, warum dies unten nach oben statt zu zählen braucht, wie eine typische Schleife, aber es sollte keinen Unterschied machen.

+0

Sieht in der Tat fischig, gut fangen – Ctx

+0

Der Grund für den Countdown ist eine Empfehlung von der Stackoverflow-Community, die sagte "Countdown in for Schleifen ist schneller als oben". – George

+0

[Vorzeitige Optimierung ist die Wurzel allen Übels] (http://c2.com/cgi/wiki?PrematureOptimization) – Barmar

Verwandte Themen