+++ /dev/null
-#include <stdlib.h>
-#include <float.h>
-#include <R.h>
-#include <Rinternals.h>
-#include <Rmath.h>
-
-#include <stdio.h>
-
-// (K,L): dim(medoids)
-// mi: medoids indices
-SEXP computeMedoidsIndices(SEXP medoids_, SEXP ref_series_)
-{
- double *medoids = (double*) R_ExternalPtrAddr(medoids_),
- *ref_series = REAL(ref_series_);
- int nb_series = INTEGER(getAttrib(ref_series_, R_DimSymbol))[0],
- K = INTEGER(getAttrib(medoids_, R_DimSymbol))[0],
- L = INTEGER(getAttrib(ref_series_, R_DimSymbol))[1],
- *mi = (int*)malloc(nb_series*sizeof(int));
-
- //TODO: debug this: medoids have same addresses on both sides, but this side fails
- printf("MED: %x\n",medoids);
-
- for (int i=0; i<nb_series ; i++)
- {
- // mi[i] <- which.min( rowSums( sweep(medoids, 2, ref_series[i,], '-')^2 ) )
- mi[i] = 0;
- double best_dist = DBL_MAX;
- for (int j=0; j<K; j++)
- {
- double dist_ij = 0.;
- for (int k=0; k<L; k++)
- {
- double delta = ref_series[k*K+i] - medoids[k*K+j];
- dist_ij += delta * delta;
- }
- if (dist_ij < best_dist)
- {
- mi[i] = j+1; //R indices start at 1
- best_dist = dist_ij;
- }
- }
- }
-
- SEXP R_mi;
- PROTECT(R_mi = allocVector(INTSXP, nb_series));
- for (int i = 0; i < nb_series; i++)
- INTEGER(R_mi)[i] = mi[i];
- UNPROTECT(1);
- free(mi);
- return R_mi;
-}