Uma das vantagens de se trabalhar com o RcppEigen e Rcpp, além da velocidade, é o fato de que não é necessário implementar todas as funções de interesse em C++. Podemos importar funções já existentes do R para que essas sejam executadas no ambiente Rcpp.
Por exemplo, um problema comum na formação de portfólios é o fato das matrizes de correlações estimadas entre os retornos dos ativos não ser Positivas Definidas. Nesses casos, problemas teóricos e numéricos podem surgir impedindo a obtenção de uma solução ótima para o problema de alocação de portfólios. Higham, N. (2002) propôs uma abordagem numérica para se encontrar a matriz Positiva Definida mais próxima da matriz de ineteresse.
Essa função está disponível no pacote Matrix e é denominada nearPD. Podemos importá-la no ambiente Rcpp da seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // [[Rcpp::export]] Eigen::MatrixXd nearPDefinite(Eigen::MatrixXd X, int maxit=1e+6, double eigtol = 1e-06, double conv_tol = 1e-07, double posd_tol = 1e-08, bool keepDiagonal= false ){ //Cria o objeto com o Environment. Rcpp::Environment G = Rcpp::Environment::global_env(); //Objeto com as informações do pacote Matrix Rcpp::Environment Matrix( "package:Matrix" ); //Importa a função de ineteresse Function f = Matrix[ "nearPD" ]; //Obtêm o resultado da função nearPD Rcpp::List res = f(X, false , keepDiagonal, true , false , true , false , false , eigtol, conv_tol, posd_tol, 100, "I" , false ); //Pega o primeiro elemento da lista e transforma para matrix Rcpp::NumericMatrix mat = internal::convert_using_rfunction(wrap(res[0]), "as.matrix" ); //Converte de Rcpp::NumericMatrix para Eigen::MatrixXd Eigen::MatrixXd Xpd=convertMatrix<eigen::matrixxd,rcpp::numericmatrix>(mat); //Retorna o resultado return (Xpd); } </eigen::matrixxd,rcpp::numericmatrix> |
A função anterior, após compilada, pode ser utilizada no ambiente R de maneira direta pelo nome nearPDefinite. Entretanto, é necessário que a biblioteca Matrix tenha sido habilitada e esteja disponível no environment do R para que seja utilizada. Essa estratégia pode ser para outras funções de outros pacotes também.