diff options
| author | Gertjan van den Burg <burg@ese.eur.nl> | 2014-03-14 18:05:42 +0100 |
|---|---|---|
| committer | Gertjan van den Burg <burg@ese.eur.nl> | 2014-03-14 18:05:42 +0100 |
| commit | a7ff24fcf75121b4bca08f97439376e8157a3270 (patch) | |
| tree | 88d2c5a5fd67d2a65de199a1377f58b9d771f3c7 | |
| parent | start work on eigen decomposition (diff) | |
| download | gensvm-a7ff24fcf75121b4bca08f97439376e8157a3270.tar.gz gensvm-a7ff24fcf75121b4bca08f97439376e8157a3270.zip | |
write eigen to data structure
| -rw-r--r-- | include/msvmmaj_kernel.h | 2 | ||||
| -rw-r--r-- | 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 <math.h> #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; i<n; i++) { for (j=0; j<n; j++) - matrix_set(data->Z, 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<n; i++) { - printf("%+16.16f\n", Lambda[i]); - } - printf("\n"); - - long j; + + print_matrix(Lambda, n, 1); + + // revert P to row-major order + long i, j; for (i=0; i<n; i++) for (j=0; j<n; j++) P[i*n+j] = tempP[j*n+i]; print_matrix(P, n, n); - printf("\n"); - print_matrix(K, n, n); - - free(tempP); + free(tempP); - exit(1); + // replace by number of columns of P + return n; } /** |
