View difference between Paste ID: AHEwSTZ5 and 2xJbCjdd
SHOW: | | - or go back to the newest paste.
1
library(kernlab)
2
N = 10000
3
p = 5
4
b = 1000
5
X = matrix(rnorm(N*p), ncol = p)
6
center = X[sample(1:N, b),]
7
sigma = 1
8
kernel_X <- kernelMatrix(rbfdot(sigma=1/(2*sigma^2)), X, center)
9
10
library(Rcpp)
11
library(RcppArmadillo)
12
settings <- getPlugin("Rcpp")
13
settings$env$PKG_CXXFLAGS <- paste('-fopenmp', settings$env$PKG_CXXFLAGS)
14
settings$env$PKG_LIBS <- paste('-fopenmp -lgomp', settings$env$PKG_LIBS)
15
do.call(Sys.setenv, settings$env)
16
sourceCpp(code = '
17
// [[Rcpp::depends(RcppArmadillo)]]
18
#include <RcppArmadillo.h>
19
#include <omp.h>
20
using namespace Rcpp;
21
using namespace arma;
22
// [[Rcpp::export]]
23
24
NumericMatrix kernelMatrix_cpp(NumericMatrix Xr, NumericMatrix Centerr, double sigma) {
25
	omp_set_num_threads(omp_get_max_threads());
26
	uword n = Xr.nrow(), b = Centerr.nrow(), row_index, col_index;
27
	mat X(Xr.begin(), n, Xr.ncol(), false);
28
	mat Center(Centerr.begin(), b, Centerr.ncol(), false);
29
	mat KerX(n, b);
30
	#pragma omp parallel private(row_index, col_index)
31
	for (row_index = 0; row_index < n; row_index++)
32
	{
33
		#pragma omp for nowait
34
		for (col_index = 0; col_index < b; col_index++)
35
		{
36
			KerX(row_index, col_index) = exp(sum(square(X.row(row_index) - Center.row(col_index))) / (-2.0 * sigma * sigma));
37
		}
38
	}
39
    return wrap(KerX);
40
}')
41
kernel_X_cpp = kernelMatrix_cpp(X, center, sigma)
42
all.equal([email protected], kernel_X_cpp)
43
sum(abs([email protected] - kernel_X_cpp) < 1e-12)
44
45
library(rbenchmark)
46
benchmark(kernelMatrix_cpp(X, center, sigma), kernelMatrix(rbfdot(sigma=1/(2*sigma^2)), X, center), columns=c("test", "replications","elapsed", "relative"), replications=50, order="relative")