SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

quarta-feira, 15 de março de 2017

Introdução ao RCpp - Parte 3.


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:

#include 
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;
}
Após compilar o código, a invocação no R é quase imediata:
#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)



Nenhum comentário:

Postar um comentário