3
3
// var.h: Rcpp R/C++ interface class library -- var
4
4
//
5
5
// Copyright (C) 2011 Dirk Eddelbuettel and Romain Francois
6
+ // Copyright (C) 2015 Wush Wu
6
7
//
7
8
// This file is part of Rcpp.
8
9
//
@@ -26,18 +27,38 @@ namespace Rcpp{
26
27
namespace sugar {
27
28
28
29
template <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> > {
30
31
public:
31
32
typedef typename Rcpp::VectorBase<RTYPE,NA,T> VEC_TYPE ;
32
- typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
33
33
34
34
Var ( const VEC_TYPE& object_ ) : object(object_){}
35
35
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 );
41
62
}
42
63
43
64
private:
@@ -51,6 +72,20 @@ inline sugar::Var<REALSXP,NA,T> var( const VectorBase<REALSXP,NA,T>& t){
51
72
return sugar::Var<REALSXP,NA,T>( t ) ;
52
73
}
53
74
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
+ }
54
89
55
90
} // Rcpp
56
91
#endif
0 commit comments