diff options
Diffstat (limited to 'src/msvmmaj_kernel.c')
| -rw-r--r-- | src/msvmmaj_kernel.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/msvmmaj_kernel.c b/src/msvmmaj_kernel.c index fc699dd..5ac138c 100644 --- a/src/msvmmaj_kernel.c +++ b/src/msvmmaj_kernel.c @@ -31,14 +31,18 @@ */ void msvmmaj_make_kernel(struct MajModel *model, struct MajData *data) { - if (model->kerneltype == K_LINEAR) + long i, j; + if (model->kerneltype == K_LINEAR) { + model->J = Calloc(double, model->m+1); + for (i=1; i<model->m+1; i++) + matrix_set(model->J, 1, i, 0, 1.0); return; + } - long i, j; long n = model->n; double value; double *x1, *x2; - double *K = Calloc(double, n*n*sizeof(double)); + double *K = Calloc(double, n*n); for (i=0; i<n; i++) { for (j=i; j<n; j++) { @@ -63,8 +67,6 @@ 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); long num_eigen = msvmmaj_make_eigen(K, n, P, Lambda); @@ -79,6 +81,13 @@ void msvmmaj_make_kernel(struct MajModel *model, struct MajData *data) } data->m = n; + // Set the regularization matrix (change if not full rank used) + model->J = Calloc(double, model->m+1); + for (i=1; i<model->m+1; i++) { + value = 1.0/matrix_get(Lambda, 1, i-1, 0); + matrix_set(model->J, 1, i, 0, value); + } + // let data know what it's made of data->kerneltype = model->kerneltype; free(data->kernelparam); @@ -192,8 +201,6 @@ long msvmmaj_make_eigen(double *K, long n, double *P, double *Lambda) for (j=0; j<n; j++) P[i*n+j] = tempP[j*n+i]; - print_matrix(P, n, n); - free(tempP); // replace by number of columns of P |
