Rubner的C语言实现
我们尝试使用Rubner公开的C语言代码(example1.c),
编译依赖emd.c和emd.h。
其中特征量类型feature_t在emd.h中定义如下:
typedef struct { int X,Y,Z; } feature_t;
具体实现代码见emd.c。
对于上述例子的解答如下:
# include <stdio.h>
# include <math.h>
# include "emd.h"
/* 欧几里得距离 */
float dist(feature_t *F1, feature_t *F2) {
int dX = F1->X - F2->X;
int dY = F1->Y - F2->Y;
int dZ = F1->Z - F2->Z;
return sqrt(dXdX + dY*dY + dZ*dZ);
}
int main() {
/* 分布P的特征矢量 */
feature_t f1[4] = { {100,40,22}, {211,20,2}, {32,190,150}, {2,100,100} };
/*分布Q的特征矢量 */
feature_t f2[3] = { {0,0,0}, {50,100,80}, {255,255,255} };
/*分布P的权重 */
float w1[5] = { 0.4, 0.3, 0.2, 0.1 };
/*分布Q的权重 */
float w2[3] = { 0.5, 0.3, 0.2 };
/*分布P的签名 */
signature_t s1 = { 4, f1, w1 };
/*分布Q的签名 */
signature_t s2 = { 3, f2, w2};
/* 计算EMD */
float e;
e = emd(&s1, &s2, dist, 0, 0);
printf("emd = %f\n", e); return 0;
}