Aqui neste post continuaremos com a análise dos possíveis métodos desenvovidos usando Rcpp. O primeiro exemplo trata do uso de matrizes, especificamente, vamos criar uma função para fazer a transposição de uma matriz:
#includeApós compilar o código, a invocação no R é quase imediata:using namespace Rcpp; // Função para transposição de matriz // [[Rcpp::export]] NumericMatrix transpose(NumericMatrix x) { //Obtêm o número de linhas e colunas: int nrow = x.nrow(), ncol = x.ncol(); //Cria a matriz com resultado NumericMatrix resultado(ncol,nrow); //Faz a transposição: for(int i=0;i < nrow; i++){ for(int j=0;j < ncol; j++){ resultado(j,i)=x(i,j); } } return resultado; }
#Invoca a biblioteca RCpp
library(Rcpp)
#Define o endereço do arquivo Cpp
setwd("C:\\Blog\\Source")
#Compila o código em C++
sourceCpp('Teste.cpp')
#Cria uma matriz de exemplo
mat<-matrix(c(2,8,9,0,0,0,4,3,2), nrow=3,ncol=3)
#Transpoem a matriz
transpose(mat)
Métodos mais sofisticados usando funções implementadas em R e invocadas em C++ também podem ser utilizadas:
//Usando funções do R:
// [[Rcpp::export]]
NumericVector ExemploKernel(NumericVector x, NumericVector y, Function f) {
NumericVector res = f(x,y);
return res;
}
Método esse que recebe como argumento dois vetores numéricos e uma função bivariada:
#Cria uma função no R
gaussian<-function(x,y){
return(sum((x-y)^2))
}
#Gera dois vetores
x<-rnorm(1000)
y<-rnorm(1000)
#Invoca a função em Rcpp:
ExemploKernel(x,y,gaussian)
