[Rcpp-devel] Principal Component in Armadillo
João Daniel Nunes Duarte
jdanielnd at gmail.com
Tue Mar 12 18:10:16 CET 2013
Thanks for your explanation, Dirk! Indeed, I looked at Armadillo
documentation, but it was not clear what was the kind of return.
Regarding the linking error, I had created the package using
Rcpp.package.skeleton (because I didn't know I was going to use
RcppArmadillo), and then I made the necessary changes according to
documentation (
http://romainfrancois.blog.free.fr/index.php?post/2010/05/19/RcppArmadillo-0.2.1).
So I created the package again using "RcppArmadillo.package.skeleton" and
everything worked fine!
Actually, what "RcppArmadillo.package.skeleton" creates is slightly
different from what is described on documentation (maybe it is system
dependent):
- Documentation
# Makevars
PKG_LIBS = $(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()" )
$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
# Makevars.win
PKG_LIBS = $(shell Rscript.exe -e "Rcpp:::LdFlags()") $(LAPACK_LIBS)
$(BLAS_LIBS) $(FLIBS)
- Documentation
# Makevars
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` $(LAPACK_LIBS)
$(BLAS_LIBS) $(FLIBS)
# Makevars.win
PKG_LIBS = $(shell $(R_HOME)/bin/Rscript.exe -e "Rcpp:::LdFlags()")
$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
So, it seems that the R libraries was not being imported during the package
compilation; problem solved!
Regards,
João Daniel
2013/3/11 Dirk Eddelbuettel <edd at debian.org>
>
>
> On 11 March 2013 at 22:42, João Daniel Nunes Duarte wrote:
> | Hello,
> |
> | I'm trying to calculate principal component using 'princomp' function
> from
> | RcppArmadillo. Here's the cpp code:
> |
> | #include <RcppArmadillo.h>
> |
> | RcppExport SEXP pca(SEXP mats) {
> | try {
> |
> | Rcpp::NumericMatrix matr(mats);
> | int n = matr.nrow(), k = matr.ncol();
> |
> | arma::mat mat(matr.begin(), n, k, false);
> | arma::colvec pca;
> |
> | pca = arma::princomp(mat);
> |
> | return Rcpp::wrap(mat);
> |
> | } catch(...) {
> | ::Rf_error("c++ error");
> | }
> | }
> |
> | However, when I "R CMD check" the package, I get the following error:
> |
> | ** testing if installed package can be loaded
> | Error in dyn.load(file, DLLpath = DLLpath, ...) :
> | unable to load shared object
> '/home/tecto/cpp/Rcpp/amora.Rcheck/amora/libs/
> | amora.so':
> | /home/tecto/cpp/Rcpp/amora.Rcheck/amora/libs/amora.so: undefined
> symbol:
> | dgesvd_
> | Error: loading failed
> | Execution halted
> |
> | I've read the Armadillo documentation for that function (http://
> | arma.sourceforge.net/docs.html#princomp), however it was not clear to
> me how to
> | use it correctly.
> |
> | Does my code have any mistake?
>
> Yes, several in fact. princomp() returns a matrix, not a vector. You were
> trying to return mat when you probably meant to return pca.
>
> As for your linking error: should not happen. On all systems,
> RcppArmadillo
> should get these BLAS functions from R by linking to R. Unless your R is
> built in a weird way.
>
> Here is what I get in the slightly corrected (and rewritten to use
> sourceCpp() instead) example below:
>
>
> R> sourceCpp("/tmp/joao.cpp")
>
> R> M <- matrix(1:9, 3, 3)
>
> R> localpca(M)
> 1.0000 4.0000 7.0000
> 2.0000 5.0000 8.0000
> 3.0000 6.0000 9.0000
>
> 0.5774 0.8165 0
> 0.5774 -0.4082 -0.7071
> 0.5774 -0.4082 0.7071
>
> [,1] [,2] [,3]
> [1,] 0.57735 0.816497 0.000000
> [2,] 0.57735 -0.408248 -0.707107
> [3,] 0.57735 -0.408248 0.707107
> R>
>
>
> The program follows:
>
>
> -----------------------------------------------------------------------------
>
> #include <RcppArmadillo.h>
>
> // [[Rcpp::depends(RcppArmadillo)]]
>
> // [[Rcpp::export]]
> Rcpp::NumericMatrix localpca(Rcpp::NumericMatrix matr) {
> int n = matr.nrow(), k = matr.ncol();
> arma::mat mat(matr.begin(), n, k, false);
> Rcpp::Rcout << mat << std::endl;
> arma::mat pca = arma::princomp(mat);
> Rcpp::Rcout << pca << std::endl;
> return Rcpp::wrap(pca);
> }
>
> /*** R
> M <- matrix(1:9, 3, 3)
> localpca(M)
> */
>
>
> -----------------------------------------------------------------------------
>
> And for what it is worth, R returns the same (modulo ordering):
>
> R> prcomp(M)
> Standard deviations:
> [1] 1.73205 0.00000 0.00000
>
> Rotation:
> PC1 PC2 PC3
> [1,] 0.57735 0.000000 0.816497
> [2,] 0.57735 -0.707107 -0.408248
> [3,] 0.57735 0.707107 -0.408248
>
>
>
> Hth, Dirk
>
> |
> | Cheers,
> |
> | João Daniel
> |
> | ----------------------------------------------------------------------
> | _______________________________________________
> | Rcpp-devel mailing list
> | Rcpp-devel at lists.r-forge.r-project.org
> | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
> --
> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20130312/c52fc95d/attachment.html>
More information about the Rcpp-devel
mailing list