在特征值比对的时候,会遇到求两个特征向量之间相似度的情况,以下代码为求两个特征向量的欧氏距离然后转换为相似度的几行代码。
1.由于相似度一般是在0-1之间,而欧氏距离可能会很大,所以首先将特征向量归一化到0-1之间。
2.求欧氏距离
3.由于欧式距离越大,相似度越低,所以后面用一个公式转换了一下。
float cmp_featLv2(const void* _f1, const void* _f2)
{
const float * pf1 = (float *)_f1, *pf2 = (float*)_f2;
float c = 0;
float temp = 0.0;
float ptemp1[256] = {0.0};
float ptemp2[256] = {0.0};
//先把特征值归一化到 0-1 之间。,
float norm1 = 0.0;
float norm2 = 0.0;
for (auto i = 0; i < 256; i++)
{
norm1 += pf1[i] * pf1[i];
norm2 += pf2[i] * pf2[i];
}
norm1 = sqrt(norm1);//求出向量的模
norm2 = sqrt(norm2);//求出向量的模
for (auto i = 0; i < 256; i++)
{
ptemp1[i]= pf1[i] / norm1;
ptemp2[i]= pf2[i] / norm2;
}
//求出欧式距离
for (auto i = 0; i < 256; i++)
{
temp += (ptemp1[i] - ptemp2[i]) * (ptemp1[i] - ptemp2[i]);
}
c = sqrt(temp);
return ( 1/(1 + c) );//由于欧式距离越大,相似度越小,因此需要将欧式距离转换成相似度。
}