我有以下代码正确计算输入char array
和现有char数组数组之间的jaccard相似性。 jacc_sim_rec[]
用于记录满足最小阈值的相似性。 for循环用于遍历多维数组,如果if (jacc_sim < SIM_THRESHOLD);
不满足最小阈值,则循环应继续检查相似性,否则记录结果
else
{
jacc_sim_rec[j] = jacc_sim;//keep record of similarity
++j;//record number of highly similar elements
}
我的问题是,每次满足阈值时,else
块中的所有语句都会执行两次。
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
}
}
}
答案 0 :(得分:1)
我不理解代码,但我敢打赌,问题是你不是每次都通过cnt
循环重新初始化for
,所以你只填写{{1} r1
时的{},r2
和r3
。
将该循环更改为:
i = 0
我也不确定为什么这需要倒数而不是像典型的循环一样,但它不应该有所作为。