complete first draft of package
[epclust.git] / old_C_code / stage1 / src / Algorithm / get_dissimilarities.c
CommitLineData
ab4a34ef
BA
1#include "Util/types.h"
2#include <stdlib.h>
3#include <math.h>
4
5// compute L^p dissimilarities for a nxm matrix
73d68777 6float* get_dissimilarities_intra(float* samples, uint32_t nbSamples, uint32_t nbValues, uint32_t p)
ab4a34ef 7{
73d68777 8 float* dissimilarities = (float*) malloc(nbSamples*nbSamples*sizeof(float));
ab4a34ef
BA
9 for (uint32_t i=0; i<nbSamples; i++)
10 {
11 dissimilarities[i*nbSamples+i] = 0.0;
12 for (uint32_t j=0; j<i; j++)
13 {
14 // dissimilarities[i*nbSamples+j] = L^p distance between reduced rows i and j
15 double dissim = 0.0;
16 for (uint32_t m=0; m<nbValues; m++)
17 {
18 double delta = fabs(samples[i*nbValues+m] - samples[j*nbValues+m]);
19 dissim += pow(delta, p);
20 }
21 dissimilarities[i*nbSamples+j] = pow(dissim, 1.0/p);
22 dissimilarities[j*nbSamples+i] = dissimilarities[i*nbSamples+j];
23 }
24 }
25 return dissimilarities;
26}
27
28// compute L^p dissimilarities between rows of 2 matrices
73d68777 29float* get_dissimilarities_inter(float* mat1, uint32_t n1, float* mat2, uint32_t n2,
ab4a34ef
BA
30 uint32_t nbValues, uint32_t p)
31{
73d68777 32 float* dissimilarities = (float*) malloc(n1*n2*sizeof(float));
ab4a34ef
BA
33 for (uint32_t i=0; i<n1; i++)
34 {
35 for (uint32_t j=0; j<n2; j++)
36 {
37 double dissim = 0.0;
38 for (uint32_t m=0; m<nbValues; m++)
39 {
40 double delta = fabs(mat1[i*nbValues+m] - mat2[j*nbValues+m]);
41 dissim += pow(delta, p);
42 }
43 dissimilarities[i*n2+j] = pow(dissim, 1.0/p);
44 }
45 }
46 return dissimilarities;
47}