2017-09-22 5 views
0

入力char arrayと既存のchar配列の配列の間のjaccardの類似度を正しく計算する次のコードがあります。 jacc_sim_rec[]は、最小閾値を満足する類似性を記録するために使用される。ループのための多次元配列を反復処理するために使用され、ループが最小しきい値が他のif (jacc_sim < SIM_THRESHOLD);で満足していないかどうかをチェックする類似度を続けるこのelseブロックが2回実行されるのはなぜですか?

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

で結果を記録することになっている私の問題はelseで、全体の文ですブロックがしきい値を満たすたびに2回実行される。

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

2つの異なる繰り返しだけでなく、同じ繰り返しで2回起こっていると思いますか? – Barmar

+0

'if(jacc_sim = SIM_THRESHOLD){...} 'と書くのはなぜですか? – Barmar

+1

私はデバッグしました@Barmar – George

答えて

1

私は、コードを理解していないが、あなたが唯一のr1を埋めるように、私は、あなたがforループを通るたびにcntを再初期化していないという問題がある賭ける、r2、そしてr3i = 0 。これは典型的なループのように、ダウン代わりにアップカウントする必要がありますが、それは違いを作るべきではない、なぜ私もよく分からない

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]; 
    } 

:ループに

変更。

+0

実際に魚のような、良いキャッチに見える – Ctx

+0

カウントダウンの理由は、 "ループのカウントダウンはアップよりも速い"と述べたstackoverflowコミュニティからの推薦に従っている。 – George

+0

[時期尚早最適化はすべての悪の根源です](http://c2.com/cgi/wiki?PrematureOptimization) – Barmar

関連する問題