major folder reorganisation, R pkg is now epclust/ at first level. Experimental usage...
[epclust.git] / old_C_code / stage1 / src / Algorithm / get_dissimilarities.c
diff --git a/old_C_code/stage1/src/Algorithm/get_dissimilarities.c b/old_C_code/stage1/src/Algorithm/get_dissimilarities.c
new file mode 100644 (file)
index 0000000..5dc8ea2
--- /dev/null
@@ -0,0 +1,47 @@
+#include "Util/types.h"
+#include <stdlib.h>
+#include <math.h>
+
+// compute L^p dissimilarities for a nxm matrix
+float* get_dissimilarities_intra(float* samples, uint32_t nbSamples, uint32_t nbValues, uint32_t p)
+{
+       float* dissimilarities = (float*) malloc(nbSamples*nbSamples*sizeof(float));
+       for (uint32_t i=0; i<nbSamples; i++)
+       {
+               dissimilarities[i*nbSamples+i] = 0.0;
+               for (uint32_t j=0; j<i; j++)
+               {
+                       // dissimilarities[i*nbSamples+j] = L^p distance between reduced rows i and j
+                       double dissim = 0.0;
+                       for (uint32_t m=0; m<nbValues; m++)
+                       {
+                               double delta = fabs(samples[i*nbValues+m] - samples[j*nbValues+m]);
+                               dissim += pow(delta, p);
+                       }
+                       dissimilarities[i*nbSamples+j] = pow(dissim, 1.0/p);
+                       dissimilarities[j*nbSamples+i] = dissimilarities[i*nbSamples+j];
+               }
+       }
+       return dissimilarities;
+}
+
+// compute L^p dissimilarities between rows of 2 matrices
+float* get_dissimilarities_inter(float* mat1, uint32_t n1, float* mat2, uint32_t n2, 
+       uint32_t nbValues, uint32_t p)
+{
+       float* dissimilarities = (float*) malloc(n1*n2*sizeof(float));
+       for (uint32_t i=0; i<n1; i++)
+       {
+               for (uint32_t j=0; j<n2; j++)
+               {
+                       double dissim = 0.0;
+                       for (uint32_t m=0; m<nbValues; m++)
+                       {
+                               double delta = fabs(mat1[i*nbValues+m] - mat2[j*nbValues+m]);
+                               dissim += pow(delta, p);
+                       }
+                       dissimilarities[i*n2+j] = pow(dissim, 1.0/p);
+               }
+       }
+       return dissimilarities;
+}