[Rcpp-commits] r2707 - in pkg/Rcpp: . inst/include/Rcpp inst/include/Rcpp/vector
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Sat Dec 4 13:49:36 CET 2010
Author: romain
Date: 2010-12-04 13:49:35 +0100 (Sat, 04 Dec 2010)
New Revision: 2707
Added:
pkg/Rcpp/inst/include/Rcpp/vector/SubMatrix.h
Modified:
pkg/Rcpp/ChangeLog
pkg/Rcpp/inst/include/Rcpp/Vector.h
pkg/Rcpp/inst/include/Rcpp/vector/Matrix.h
pkg/Rcpp/inst/include/Rcpp/vector/MatrixBase.h
Log:
factor out SubMatrix in its own file
Modified: pkg/Rcpp/ChangeLog
===================================================================
--- pkg/Rcpp/ChangeLog 2010-12-04 12:06:12 UTC (rev 2706)
+++ pkg/Rcpp/ChangeLog 2010-12-04 12:49:35 UTC (rev 2707)
@@ -5,6 +5,8 @@
* inst/include/Rcpp/vector/matrix.h: fix SubMatrix. Bug reported by
Christian Gunnning <xian at unm.edu> on Rcpp-devel
+
+ * inst/include/Rcpp/vector/SubMatrix.h: factored out of matrix.h
2010-12-03 Dirk Eddelbuettel <edd at debian.org>
Modified: pkg/Rcpp/inst/include/Rcpp/Vector.h
===================================================================
--- pkg/Rcpp/inst/include/Rcpp/Vector.h 2010-12-04 12:06:12 UTC (rev 2706)
+++ pkg/Rcpp/inst/include/Rcpp/Vector.h 2010-12-04 12:49:35 UTC (rev 2707)
@@ -39,6 +39,7 @@
template <int RTYPE> class MatrixRow ;
template <int RTYPE> class MatrixColumn ;
+template <int RTYPE> class SubMatrix ;
#include <Rcpp/vector/RangeIndexer.h>
@@ -49,6 +50,7 @@
#include <Rcpp/vector/traits.h>
#include <Rcpp/vector/Matrix.h>
+#include <Rcpp/vector/SubMatrix.h>
#include <Rcpp/vector/MatrixRow.h>
#include <Rcpp/vector/MatrixColumn.h>
Modified: pkg/Rcpp/inst/include/Rcpp/vector/Matrix.h
===================================================================
--- pkg/Rcpp/inst/include/Rcpp/vector/Matrix.h 2010-12-04 12:06:12 UTC (rev 2706)
+++ pkg/Rcpp/inst/include/Rcpp/vector/Matrix.h 2010-12-04 12:49:35 UTC (rev 2707)
@@ -21,8 +21,6 @@
#ifndef Rcpp__vector__Matrix_h
#define Rcpp__vector__Matrix_h
-
-template <int RTYPE> class SubMatrix ;
template <int RTYPE>
class Matrix : public Vector<RTYPE>, public MatrixBase<RTYPE,true, Matrix<RTYPE> > {
@@ -222,68 +220,5 @@
} ;
-template <int RTYPE>
-class SubMatrix : public Rcpp::MatrixBase< RTYPE, true, SubMatrix<RTYPE> > {
-public:
- typedef Matrix<RTYPE> MATRIX ;
- typedef typename Vector<RTYPE>::iterator vec_iterator ;
- typedef typename MATRIX::Proxy Proxy ;
-
- SubMatrix( MATRIX& m_, const Range& row_range_, const Range& col_range_ ) :
- m(m_),
- iter( static_cast< Vector<RTYPE>& >(m_).begin() + row_range_.get_start() + col_range_.get_start() * m_.nrow() ),
- m_nr( m.nrow() ),
- nc( col_range_.size() ),
- nr( row_range_.size() )
- {}
-
- inline int size() const { return ncol() * nrow() ; }
- inline int ncol() const { return nc ; }
- inline int nrow() const { return nr ; }
-
- inline Proxy operator()(int i, int j) const {
- return iter[ i + j*m_nr ] ;
- }
-
- inline vec_iterator column_iterator( int j ) const { return iter + j*m_nr ; }
-
-private:
- MATRIX& m ;
- vec_iterator iter ;
- int m_nr, nc, nr ;
-} ;
-template <int RTYPE>
-Matrix<RTYPE>::Matrix( const SubMatrix<RTYPE>& sub ) : nrows(sub.nrow()) {
- int nc = sub.ncol() ;
- VECTOR::setSEXP( Rf_allocMatrix( RTYPE, nrows, nc ) ) ;
- iterator start = VECTOR::begin() ;
- iterator rhs_it ;
- for( int j=0; j<nc; j++){
- rhs_it = sub.column_iterator(j) ;
- for( int i=0; i<nrows; i++, ++start){
- *start = rhs_it[i] ;
- }
- }
-}
-
-template <int RTYPE>
-Matrix<RTYPE>& Matrix<RTYPE>::operator=( const SubMatrix<RTYPE>& sub ){
- int nc = sub.ncol(), nr = sub.nrow() ;
- if( nc != nrow() || nr != ncol() ){
- nrows = nr ;
- VECTOR::setSEXP( Rf_allocMatrix( RTYPE, nr, nc ) ) ;
- }
- iterator start = VECTOR::begin() ;
- iterator rhs_it ;
- for( int j=0; j<nc; j++){
- rhs_it = sub.column_iterator(j) ;
- for( int i=0; i<nrows; i++, ++start){
- *start = rhs_it[i] ;
- }
- }
- return *this ;
-}
-
-
#endif
Modified: pkg/Rcpp/inst/include/Rcpp/vector/MatrixBase.h
===================================================================
--- pkg/Rcpp/inst/include/Rcpp/vector/MatrixBase.h 2010-12-04 12:06:12 UTC (rev 2706)
+++ pkg/Rcpp/inst/include/Rcpp/vector/MatrixBase.h 2010-12-04 12:49:35 UTC (rev 2707)
@@ -39,9 +39,6 @@
return static_cast<MATRIX&>(*this) ;
}
- // inline stored_type operator[]( int i) const {
- // return static_cast<const MATRIX*>(this)->operator[](i) ;
- // }
inline stored_type operator()( int i, int j) const throw(not_a_matrix) {
return static_cast<const MATRIX*>(this)->operator()(i, j) ;
}
Added: pkg/Rcpp/inst/include/Rcpp/vector/SubMatrix.h
===================================================================
--- pkg/Rcpp/inst/include/Rcpp/vector/SubMatrix.h (rev 0)
+++ pkg/Rcpp/inst/include/Rcpp/vector/SubMatrix.h 2010-12-04 12:49:35 UTC (rev 2707)
@@ -0,0 +1,105 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// SubMatrix.h: Rcpp R/C++ interface class library -- sub matrices
+//
+// Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef Rcpp__vector__SubMatrix_h
+#define Rcpp__vector__SubMatrix_h
+
+template <int RTYPE>
+class SubMatrix : public Rcpp::MatrixBase< RTYPE, true, SubMatrix<RTYPE> > {
+public:
+ typedef Matrix<RTYPE> MATRIX ;
+ typedef typename Vector<RTYPE>::iterator vec_iterator ;
+ typedef typename MATRIX::Proxy Proxy ;
+
+ SubMatrix( MATRIX& m_, const Range& row_range_, const Range& col_range_ ) :
+ m(m_),
+ iter( static_cast< Vector<RTYPE>& >(m_).begin() + row_range_.get_start() + col_range_.get_start() * m_.nrow() ),
+ m_nr( m.nrow() ),
+ nc( col_range_.size() ),
+ nr( row_range_.size() )
+ {}
+
+ inline int size() const { return ncol() * nrow() ; }
+ inline int ncol() const { return nc ; }
+ inline int nrow() const { return nr ; }
+
+ inline Proxy operator()(int i, int j) const {
+ return iter[ i + j*m_nr ] ;
+ }
+
+ inline vec_iterator column_iterator( int j ) const { return iter + j*m_nr ; }
+
+private:
+ MATRIX& m ;
+ vec_iterator iter ;
+ int m_nr, nc, nr ;
+} ;
+
+template <int RTYPE>
+Matrix<RTYPE>::Matrix( const SubMatrix<RTYPE>& sub ) : nrows(sub.nrow()) {
+ int nc = sub.ncol() ;
+ VECTOR::setSEXP( Rf_allocMatrix( RTYPE, nrows, nc ) ) ;
+ iterator start = VECTOR::begin() ;
+ iterator rhs_it ;
+ for( int j=0; j<nc; j++){
+ rhs_it = sub.column_iterator(j) ;
+ for( int i=0; i<nrows; i++, ++start){
+ *start = rhs_it[i] ;
+ }
+ }
+}
+
+template <int RTYPE>
+Matrix<RTYPE>& Matrix<RTYPE>::operator=( const SubMatrix<RTYPE>& sub ){
+ int nc = sub.ncol(), nr = sub.nrow() ;
+ if( nc != nrow() || nr != ncol() ){
+ nrows = nr ;
+ VECTOR::setSEXP( Rf_allocMatrix( RTYPE, nr, nc ) ) ;
+ }
+ iterator start = VECTOR::begin() ;
+ iterator rhs_it ;
+ for( int j=0; j<nc; j++){
+ rhs_it = sub.column_iterator(j) ;
+ for( int i=0; i<nrows; i++, ++start){
+ *start = rhs_it[i] ;
+ }
+ }
+ return *this ;
+}
+
+#undef RCPP_WRAP_SUBMATRIX
+#define RCPP_WRAP_SUBMATRIX(RTYPE) \
+template<> inline SEXP wrap< SubMatrix<RTYPE> >( \
+ const SubMatrix<RTYPE>& object \
+ ) { \
+ return Matrix<RTYPE>( object ) ; \
+ }
+RCPP_WRAP_SUBMATRIX(REALSXP)
+RCPP_WRAP_SUBMATRIX(INTSXP)
+RCPP_WRAP_SUBMATRIX(LGLSXP)
+RCPP_WRAP_SUBMATRIX(RAWSXP)
+// RCPP_WRAP_SUBMATRIX(STRSXP)
+// RCPP_WRAP_SUBMATRIX(VECSXP)
+// RCPP_WRAP_SUBMATRIX(EXPRSXP)
+#undef RCPP_WRAP_SUBMATRIX
+
+
+#endif
More information about the Rcpp-commits
mailing list