[Rcpp-commits] r710 - in pkg/RcppArmadillo: R src
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Wed Feb 17 00:13:01 CET 2010
Author: romain
Date: 2010-02-17 00:13:01 +0100 (Wed, 17 Feb 2010)
New Revision: 710
Modified:
pkg/RcppArmadillo/R/zzz.R
pkg/RcppArmadillo/src/RcppArmadillo.cpp
pkg/RcppArmadillo/src/RcppArmadillo.h
Log:
first steps at Rcpp::as< Mat<> >
Modified: pkg/RcppArmadillo/R/zzz.R
===================================================================
--- pkg/RcppArmadillo/R/zzz.R 2010-02-16 22:56:28 UTC (rev 709)
+++ pkg/RcppArmadillo/R/zzz.R 2010-02-16 23:13:01 UTC (rev 710)
@@ -3,3 +3,10 @@
.Call( "RcppArmadilloExample", PACKAGE = "RcppArmadillo" )
}
+RcppArmadilloExample_as <- function(){
+ integer_mat <- matrix( as.integer(diag(4)), ncol = 4, nrow = 4 )
+ numeric_mat <- diag(5)
+ .Call( "RcppArmadilloExample_as",
+ list( integer_mat, numeric_mat ),
+ PACKAGE = "RcppArmadillo" )
+}
Modified: pkg/RcppArmadillo/src/RcppArmadillo.cpp
===================================================================
--- pkg/RcppArmadillo/src/RcppArmadillo.cpp 2010-02-16 22:56:28 UTC (rev 709)
+++ pkg/RcppArmadillo/src/RcppArmadillo.cpp 2010-02-16 23:13:01 UTC (rev 710)
@@ -23,3 +23,17 @@
return output ;
}
+SEXP RcppArmadilloExample_as( SEXP input_ ){
+ using namespace Rcpp ;
+ using namespace arma ;
+
+ List input(input_) ;
+ imat m1 = input[0] ; /* implicit as */
+ mat m2 = input[1] ; /* implicit as */
+
+ List res(2) ;
+ res[0] = accu( m1 ) ;
+ res[1] = accu( m2 ) ;
+
+ return res ;
+}
Modified: pkg/RcppArmadillo/src/RcppArmadillo.h
===================================================================
--- pkg/RcppArmadillo/src/RcppArmadillo.h 2010-02-16 22:56:28 UTC (rev 709)
+++ pkg/RcppArmadillo/src/RcppArmadillo.h 2010-02-16 23:13:01 UTC (rev 710)
@@ -9,11 +9,15 @@
template <typename T> SEXP wrap ( const arma::Mat<T>& ) ;
template <typename T> SEXP wrap ( const arma::Row<T>& ) ;
template <typename T> SEXP wrap ( const arma::Col<T>& ) ;
+
+ template <> arma::Mat<int> as< arma::Mat<int> >( SEXP ) ;
+ template <> arma::Mat<double> as< arma::Mat<double> >( SEXP ) ;
}
#include <Rcpp.h>
RcppExport SEXP RcppArmadilloExample() ;
+RcppExport SEXP RcppArmadilloExample_as( SEXP );
namespace Rcpp{
@@ -49,9 +53,42 @@
return vec ;
}
+} // namespace Rcpp
+
+
+namespace Rcpp{
+
/* as */
+template<> arma::Mat<int> as< arma::Mat<int> >(SEXP x){
+ if( !Rf_isMatrix(x) ){
+ throw std::range_error( "not a matrix" ) ;
+ }
+ SimpleVector< traits::r_sexptype_traits<int>::rtype > input(x);
+ IntegerVector dim = input.attr("dim") ;
+ arma::Mat<int> out( dim[0], dim[1] ) ;
+ int n = dim[0] * dim[1] ;
+ for( int i=0; i<n; i++){
+ out[i] = input[i] ;
+ }
+ return out ;
+}
-} // namespace Rcpp
+/* as */
+template<> arma::Mat<double> as< arma::Mat<double> >(SEXP x){
+ if( !Rf_isMatrix(x) ){
+ throw std::range_error( "not a matrix" ) ;
+ }
+ SimpleVector< traits::r_sexptype_traits<double>::rtype > input(x);
+ IntegerVector dim = input.attr("dim") ;
+ arma::Mat<double> out( dim[0], dim[1] ) ;
+ int n = dim[0] * dim[1] ;
+ for( int i=0; i<n; i++){
+ out[i] = input[i] ;
+ }
+ return out ;
+}
+}
+
#endif
More information about the Rcpp-commits
mailing list