33// var.h: Rcpp R/C++ interface class library -- var
44//
55// Copyright (C) 2011 Dirk Eddelbuettel and Romain Francois
6+ // Copyright (C) 2015 Wush Wu
67//
78// This file is part of Rcpp.
89//
@@ -26,31 +27,65 @@ namespace Rcpp{
2627namespace sugar {
2728
2829template <int RTYPE, bool NA, typename T>
29- class Var : public Lazy < typename Rcpp::traits::storage_type<RTYPE>::type , Var<RTYPE,NA,T> > {
30+ class Var : public Lazy < double , Var<RTYPE,NA,T> > {
3031public:
31- typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ;
32- typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
32+ typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ;
3333
34- Var ( const VEC_TYPE& object_ ) : object(object_){}
34+ Var ( const VEC_TYPE& object_ ) : object(object_){}
3535
36- STORAGE get () const {
37- STORAGE m = mean (object). get () ;
38- Minus_Vector_Primitive<RTYPE,NA,T> mm ( object, m) ;
39- STORAGE ssq = sum ( pow (mm, 2.0 ) ).get () ;
40- return ssq / (object.size () - 1 ) ;
41- }
36+ double get () const {
37+ double
38+ m = mean (object). get (),
39+ ssq = sum ( pow (object, 2.0 ) ).get ();
40+ return ( ssq - m * m * object. size ()) / (object.size () - 1 ) ;
41+ }
4242
4343private:
44- const VEC_TYPE& object ;
44+ const VEC_TYPE& object ;
45+ } ;
46+
47+ template <bool NA, typename T>
48+ class Var <CPLXSXP,NA,T> : public Lazy< double , Var<CPLXSXP,NA,T> > {
49+ public:
50+ typedef typename Rcpp::VectorBase<CPLXSXP,NA,T> VEC_TYPE ;
51+
52+ Var ( const VEC_TYPE& object_ ) : object(object_){}
53+
54+ double get () const {
55+ double sq = 0 , ssq = 0 ;
56+ for (int i = 0 ;i < object.size ();i++) {
57+ Rcomplex z = object[i];
58+ sq += z.r ;
59+ ssq += z.r * z.r ;
60+ }
61+ return (ssq - sq * sq / object.size ()) / (object.size () - 1 );
62+ }
63+
64+ private:
65+ const VEC_TYPE& object ;
4566} ;
4667
4768} // sugar
4869
4970template <bool NA, typename T>
5071inline sugar::Var<REALSXP,NA,T> var ( const VectorBase<REALSXP,NA,T>& t){
51- return sugar::Var<REALSXP,NA,T>( t ) ;
72+ return sugar::Var<REALSXP,NA,T>( t ) ;
5273}
5374
75+ template <bool NA, typename T>
76+ inline sugar::Var<INTSXP,NA,T> var ( const VectorBase<INTSXP,NA,T>& t){
77+ return sugar::Var<INTSXP,NA,T>( t ) ;
78+ }
79+
80+ template <bool NA, typename T>
81+ inline sugar::Var<LGLSXP,NA,T> var ( const VectorBase<LGLSXP,NA,T>& t){
82+ return sugar::Var<LGLSXP,NA,T>( t ) ;
83+ }
84+
85+ template <bool NA, typename T>
86+ inline sugar::Var<CPLXSXP,NA,T> var ( const VectorBase<CPLXSXP,NA,T>& t){
87+ return sugar::Var<CPLXSXP,NA,T>( t ) ;
88+ }
5489
5590} // Rcpp
5691#endif
0 commit comments