Skip to content

Commit 772006c

Browse files
committed
Update var.h
Implement variance for complex numbers in accordance with its definition. Reference: https://en.wikipedia.org/wiki/Variance#Generalizations
1 parent 6c05404 commit 772006c

File tree

1 file changed

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

1 file changed

+7
-6
lines changed

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,14 @@ class Var<CPLXSXP,NA,T> : public Lazy< double , Var<CPLXSXP,NA,T> > {
5454
Var( const VEC_TYPE& object_ ) : object(object_){}
5555

5656
double get() const{
57-
double sq = 0, ssq = 0;
58-
for(R_xlen_t i = 0;i < object.size();i++) {
59-
Rcomplex z = object[i];
60-
sq += z.r;
61-
ssq += z.r * z.r;
57+
const Rcomplex average = mean(object).get();
58+
const R_xlen_t sample_size = object.size();
59+
double sum_squared_deviations_magnitudes = 0.0;
60+
for (R_xlen_t i = 0; i != sample_size; ++i) {
61+
const Rcomplex deviation = object[i] - average;
62+
sum_squared_deviations_magnitudes += deviation.r * deviation.r + deviation.i * deviation.i;
6263
}
63-
return (ssq - sq * sq / object.size()) / (object.size() - 1);
64+
return sum_squared_deviations_magnitudes / (sample_size - 1);
6465
}
6566

6667
private:

0 commit comments

Comments
 (0)