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,31 +27,65 @@ 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
- 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 ;
33
33
34
- Var ( const VEC_TYPE& object_ ) : object(object_){}
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 ) ;
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
+ }
42
42
43
43
private:
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 ;
45
66
} ;
46
67
47
68
} // sugar
48
69
49
70
template <bool NA, typename T>
50
71
inline 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 ) ;
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