From 397af1adffbe96446e0d5a9df1e48da64af79af2 Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Fri, 14 Mar 2014 18:05:42 +0100 Subject: write eigen to data structure --- include/msvmmaj_kernel.h | 2 +- src/msvmmaj_kernel.c | 35 ++++++++++++++++------------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/include/msvmmaj_kernel.h b/include/msvmmaj_kernel.h index b37706a..2965c1c 100644 --- a/include/msvmmaj_kernel.h +++ b/include/msvmmaj_kernel.h @@ -23,7 +23,7 @@ struct MajModel; // function declarations void msvmmaj_make_kernel(struct MajModel *model, struct MajData *data); -void msvmmaj_make_eigen(double *K, long n, double *P, double *Lambda); +long msvmmaj_make_eigen(double *K, long n, double *P, double *Lambda); double msvmmaj_compute_rbf(double *x1, double *x2, double *kernelparam, long n); diff --git a/src/msvmmaj_kernel.c b/src/msvmmaj_kernel.c index 3a92ff5..fc699dd 100644 --- a/src/msvmmaj_kernel.c +++ b/src/msvmmaj_kernel.c @@ -10,6 +10,7 @@ * kernel matrix using several decomposition methods. * */ + #include #include "msvmmaj.h" @@ -66,18 +67,18 @@ void msvmmaj_make_kernel(struct MajModel *model, struct MajData *data) double *P = Malloc(double, n*n); double *Lambda = Malloc(double, n); - msvmmaj_make_eigen(K, n, P, Lambda); + long num_eigen = msvmmaj_make_eigen(K, n, P, Lambda); - // copy kernel to data - data->Z = realloc(data->Z, n*(n+1)*(sizeof(double))); + // copy eigendecomp to data + data->Z = realloc(data->Z, n*(n+1)*sizeof(double)); for (i=0; iZ, n+1, i, j+1, - matrix_get(K, n, i, j)); + matrix_set(data->Z, n+1, i, j+1, + matrix_get(P, n, i, j)); matrix_set(data->Z, n+1, i, 0, 1.0); } data->m = n; - + // let data know what it's made of data->kerneltype = model->kerneltype; free(data->kernelparam); @@ -111,7 +112,7 @@ void msvmmaj_make_kernel(struct MajModel *model, struct MajData *data) * * */ -void msvmmaj_make_eigen(double *K, long n, double *P, double *Lambda) +long msvmmaj_make_eigen(double *K, long n, double *P, double *Lambda) { int M, status, LWORK, *IWORK, *IFAIL; double abstol, *WORK; @@ -182,25 +183,21 @@ void msvmmaj_make_eigen(double *K, long n, double *P, double *Lambda) // Here you can put code to select the necessary eigenvectors, // depending on the size of the eigenvalues. // For now, let's just print the eigenvalues and exit - long i; - for (i=0; i