From cb2496b31cbe7fc1ef3f0caebb65c86ae34ea857 Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Fri, 14 Mar 2014 17:10:05 +0100 Subject: start work on eigen decomposition --- include/msvmmaj_kernel.h | 2 + include/msvmmaj_lapack.h | 6 ++- src/msvmmaj_kernel.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++ src/msvmmaj_lapack.c | 39 +++++++++++++++++ src/msvmmaj_matrix.c | 2 +- 5 files changed, 153 insertions(+), 2 deletions(-) diff --git a/include/msvmmaj_kernel.h b/include/msvmmaj_kernel.h index 69bf267..b37706a 100644 --- a/include/msvmmaj_kernel.h +++ b/include/msvmmaj_kernel.h @@ -23,6 +23,8 @@ 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); + double msvmmaj_compute_rbf(double *x1, double *x2, double *kernelparam, long n); double msvmmaj_compute_poly(double *x1, double *x2, double *kernelparam, diff --git a/include/msvmmaj_lapack.h b/include/msvmmaj_lapack.h index e2208ca..6ea1122 100644 --- a/include/msvmmaj_lapack.h +++ b/include/msvmmaj_lapack.h @@ -18,5 +18,9 @@ int dposv(char UPLO, int N, int NRHS, double *A, int LDA, double *B, int LDB); int dsysv(char UPLO, int N, int NRHS, double *A, int LDA, int *IPIV, double *B, int LDB, double *WORK, int LWORK); - +int dsyevx(char JOBZ, char RANGE, char UPLO, int N, double *A, int LDA, + double VL, double VU, int IL, int IU, double ABSTOL, + int *M, double *W, double *Z, int LDZ, double *WORK, int LWORK, + int *IWORK, int *IFAIL); +double dlamch(char CMACH); #endif diff --git a/src/msvmmaj_kernel.c b/src/msvmmaj_kernel.c index 9b421ac..3a92ff5 100644 --- a/src/msvmmaj_kernel.c +++ b/src/msvmmaj_kernel.c @@ -62,6 +62,12 @@ void msvmmaj_make_kernel(struct MajModel *model, struct MajData *data) } } + print_matrix(K, n, n); + + double *P = Malloc(double, n*n); + double *Lambda = Malloc(double, n); + msvmmaj_make_eigen(K, n, P, Lambda); + // copy kernel to data data->Z = realloc(data->Z, n*(n+1)*(sizeof(double))); for (i=0; i