Skip to content

Commit 0359729

Browse files
committed
pass test of #223 on compiler clang++:
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix
1 parent 053661f commit 0359729

File tree

1 file changed

+42
-7
lines changed
  • inst/include/Rcpp/sugar/functions

1 file changed

+42
-7
lines changed

inst/include/Rcpp/sugar/functions/var.h

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
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{
2627
namespace sugar{
2728

2829
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> > {
3031
public:
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

4364
private:
@@ -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

Comments
 (0)