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,18 +27,38 @@ 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:
3132 typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ;
32- typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
3333
3434 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 ) ;
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+ }
42+
43+ private:
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 );
4162 }
4263
4364private:
@@ -51,6 +72,20 @@ inline sugar::Var<REALSXP,NA,T> var( const VectorBase<REALSXP,NA,T>& t){
5172 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