[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