как скомпилировать функцию в коде C, используя RcppEigen

0

Я очень новичок в Rcpp, а точнее RcppEigen, и борюсь с тем, как использовать RcppEigen для компиляции функции C++. Вот код C++, в котором могут возникнуть некоторые проблемы.

#include <RcppEigen.h>
#include <string>

using namespace Eigen;
using namespace Rcpp;

double MatOp(const Map<MatrixXd> X, Map<MatrixXd> Y)
{ 

  int n=X.rows();
  int p=X.cols();
  //int nY=Y.cols();
  MatrixXd I(n,n);
  I.setIdentity(n,n);
  double SSE=(Y.transpose()*(I-X*(X.transpose()*X).inverse()*X.transpose())*Y).determinant();
  return (n*log(SSE/n)+log(n)*p);
}

И вот R-код,

> getwd()
[1] "C:/Users/LJH/Documents"
> RcppEigen.package.skeleton("PfCRT")

> RCppEigen_IcPf_R <- function(X,Y) {
+   .Call('TestInRcppEigen',X,Y,PACKAGE = 'PfCRT')
+ }
> 
> prompt(RCppEigen_IcPf_R)

.Rcheck файл,

* installing *source* package 'PfCRT' ...
** libs

*** arch - i386
cygwin warning:
  MS-DOS style path detected: C:/R/R-31~1.1/etc/i386/Makeconf
  Preferred POSIX equivalent is: /cygdrive/c/R/R-31~1.1/etc/i386/Makeconf
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
g++ -m32 -I"C:/R/R-31~1.1/include" -DNDEBUG    -I"C:/Users/LJH/Documents/R/win-library/3.1/Rcpp/include" -I"C:/Users/LJH/Documents/R/win-library/3.1/RcppEigen/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c TestInRcppEigen.cpp -o TestInRcppEigen.o
g++ -m32 -shared -s -static-libgcc -o PfCRT.dll tmp.def TestInRcppEigen.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/i386 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/R/R-31~1.1/bin/i386 -lR
cygwin warning:
  MS-DOS style path detected: C:/R/R-31~1.1/etc/i386/Makeconf
  Preferred POSIX equivalent is: /cygdrive/c/R/R-31~1.1/etc/i386/Makeconf
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
installing to C:/Users/LJH/Documents/PfCRT.Rcheck/PfCRT/libs/i386

*** arch - x64
cygwin warning:
  MS-DOS style path detected: C:/R/R-31~1.1/etc/x64/Makeconf
  Preferred POSIX equivalent is: /cygdrive/c/R/R-31~1.1/etc/x64/Makeconf
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
g++ -m64 -I"C:/R/R-31~1.1/include" -DNDEBUG    -I"C:/Users/LJH/Documents/R/win-library/3.1/Rcpp/include" -I"C:/Users/LJH/Documents/R/win-library/3.1/RcppEigen/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c TestInRcppEigen.cpp -o TestInRcppEigen.o
g++ -m64 -shared -s -static-libgcc -o PfCRT.dll tmp.def TestInRcppEigen.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/R/R-31~1.1/bin/x64 -lR
cygwin warning:
  MS-DOS style path detected: C:/R/R-31~1.1/etc/x64/Makeconf
  Preferred POSIX equivalent is: /cygdrive/c/R/R-31~1.1/etc/x64/Makeconf
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
installing to C:/Users/LJH/Documents/PfCRT.Rcheck/PfCRT/libs/x64
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (PfCRT)

Затем я делаю это,

> library(PfCRT)
> X1 <- matrix(c(1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,
+                0,2,0,1,0,0,3,1,0,0,3,1,0,0,3,1,0,0,3,1,0,0,3,1,0,0,3,1,0,0,3,1,0,0,3,1,0,
+                0,3,1,0,0,3.01),20,4,byrow=TRUE)
> Y <- matrix(c(50,51,52,54,53,60,59,65,67,70,70,73,74,78,82,80,87,84,88,92),20,1)
> 
> RCppEigen_IcPf_R(X1,Y)
Error in .Call("TestInRcppEigen", X, Y, PACKAGE = "PfCRT") : 
  "TestInRcppEigen" not available for .Call() for package "PfCRT"

Ошибка возникает, поэтому я предполагаю, что что-то не так в double MatOp(const Map<MatrixXd> X, Map<MatrixXd> Y) функционирует в C++. Любая помощь будет очень оценена.

Теги:
do.call
rcpp

1 ответ

1
Лучший ответ

Ваша функция C++ называется "MatOp":

double MatOp(const Map<MatrixXd> X, Map<MatrixXd> Y)

но вместо этого вы вызываете "TestInRcppEigen":

.Call('TestInRcppEigen',X,Y,PACKAGE = 'PfCRT')

который получает ошибку

Error in .Call("TestInRcppEigen", X, Y, PACKAGE = "PfCRT") : 
  "TestInRcppEigen" not available for .Call() for package "PfCRT"

что правильно: вы не предоставили TestInRcppEigen.

Либо предоставить TestInRcppEigen (путем переименования "MatOp"), либо вызвать MatOp.

Ничто из этого не имеет никакого отношения к RcppEigen как таковому, вы просто теряетесь в сорняках, как называть C++ из R. Посмотрите на виньетку Rcpp Attributes - это действительно поможет и упростит.

  • 0
    хорошо, я исправил double TestInRcppEigen(const Map<MatrixXd> X, Map<MatrixXd> Y) , в 00check.log по-прежнему есть 2 предупреждения и 2. * checking if this is a source package ... NOTE Found the following apparent object files/libraries: src-i386/PfCRT.dll src-i386/TestInRcppEigen.o src-x64/PfCRT.dll src-x64/TestInRcppEigen.o Object files/libraries should not be included in a source package.
  • 0
    * checking for executable files ... WARNING Found the following executable files: src-i386/PfCRT.dll src-i386/TestInRcppEigen.o src-x64/PfCRT.dll Source packages should not contain undeclared executable files.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню