--- /dev/null
+#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;
+}