24void omp_set_num_threads(
int a) {}
53 double sum = 0, sumSqr = 0, mean;
56 omp_set_num_threads(numThreads);
57#pragma omp parallel shared(sum)
59 double partial_sum = 0;
61 for (i = 0; i < n; i++) {
74#pragma omp parallel shared(sumSqr)
76 double partial_sumSqr = 0;
78 for (i = 0; i < n; i++) {
79 double value = x[i] - mean;
80 partial_sumSqr += value * value;
86 sumSqr += partial_sumSqr;
88 sumSqr = partial_sumSqr;
91 return sqrt(sumSqr / (n - 1));
109 double *meanAbsoluteDev,
double *x,
long n) {
128 double *meanAbsoluteDev,
double *x,
long n,
long numThreads) {
130 double sum = 0, sumSqr = 0, sum2 = 0;
131 double lMean, lRms, lStDev, lMAD;
139 if (!meanAbsoluteDev)
140 meanAbsoluteDev = &lMAD;
142 *mean = *standDev = *meanAbsoluteDev = DBL_MAX;
147 omp_set_num_threads(numThreads);
149#pragma omp parallel shared(sumSqr, sum)
151 double partial_sumSqr = 0;
152 double partial_sum = 0;
154 for (i = 0; i < n; i++) {
156 partial_sum += value;
157 partial_sumSqr += sqr(value);
162 if (numThreads > 1) {
164 sumSqr += partial_sumSqr;
167 sumSqr = partial_sumSqr;
172 *rms = sqrt(sumSqr / n);
175#pragma omp parallel shared(sum, sum2)
177 double partial_sum = 0;
178 double partial_sum2 = 0;
180 for (i = 0; i < n; i++) {
181 double value = x[i] - *mean;
182 partial_sum2 += value * value;
183 partial_sum += fabs(value);
188 if (numThreads > 1) {
189 sum2 += partial_sum2;
198 *standDev = sqrt(sum2 / (n - 1));
199 *meanAbsoluteDev = sum / n;
220 double *meanAbsoluteDev,
double *x,
double *w,
long n) {
241 double *meanAbsoluteDev,
double *x,
double *w,
long n,
long numThreads) {
243 double sumW = 0, sum = 0, sumWx = 0, sumSqrWx = 0, sum2 = 0;
245 double lMean, lRms, lStDev, lMAD;
253 if (!meanAbsoluteDev)
254 meanAbsoluteDev = &lMAD;
256 *mean = *standDev = *meanAbsoluteDev = DBL_MAX;
261 omp_set_num_threads(numThreads);
263#pragma omp parallel shared(sumW, sumWx, sumSqrWx)
265 double partial_sumW = 0;
266 double partial_sumWx = 0;
267 double partial_sumSqrWx = 0;
269 for (i = 0; i < n; i++) {
270 partial_sumW += w[i];
272 partial_sumWx += value * w[i];
273 partial_sumSqrWx += value * value * w[i];
278 if (numThreads > 1) {
279 sumW += partial_sumW;
280 sumWx += partial_sumWx;
281 sumSqrWx += partial_sumSqrWx;
284 sumWx = partial_sumWx;
285 sumSqrWx = partial_sumSqrWx;
291 *mean = sumWx / sumW;
292 *rms = sqrt(sumSqrWx / sumW);
293#pragma omp parallel shared(sum, sum2)
295 double partial_sum = 0;
296 double partial_sum2 = 0;
298 for (i = 0; i < n; i++) {
299 double value = x[i] - *mean;
300 partial_sum += value * w[i];
301 partial_sum2 += value * value * w[i];
306 if (numThreads > 1) {
308 sum2 += partial_sum2;
317 *standDev = sqrt((sum2 * n) / (sumW * (n - 1.0)));
318 *meanAbsoluteDev = sum / sumW;
324long accumulateMoments(
double *mean,
double *rms,
double *standDev,
325 double *x,
long n,
long reset) {
326 return accumulateMomentsThreaded(mean, rms, standDev, x, n, reset, 1);
329long accumulateMomentsThreaded(
double *mean,
double *rms,
double *standDev,
330 double *x,
long n,
long reset,
long numThreads) {
332 static MDB_THREAD_LOCAL
double savedSum = 0, savedSumSqr = 0;
333 static MDB_THREAD_LOCAL
long savedNTotal;
334 double sum = savedSum, sumSqr = savedSumSqr;
335 long nTotal = savedNTotal;
338 nTotal = sum = sumSqr = 0;
343 savedSumSqr = sumSqr;
344 savedNTotal = nTotal;
348 omp_set_num_threads(numThreads);
349#pragma omp parallel shared(sum, sumSqr)
351 double partial_sum = 0;
352 double partial_sumSqr = 0;
354 for (i = 0; i < n; i++) {
356 partial_sum += value;
357 partial_sumSqr += sqr(value);
362 if (numThreads > 1) {
364 sumSqr += partial_sumSqr;
367 sumSqr = partial_sumSqr;
372 *mean = sum / nTotal;
373 *rms = sqrt(sumSqr / nTotal);
374 *standDev = sqrt((sumSqr / nTotal - sqr(*mean)) * nTotal / (nTotal - 1.0));
376 savedSumSqr = sumSqr;
377 savedNTotal = nTotal;
382long accumulateWeightedMoments(
double *mean,
double *rms,
double *standDev,
383 double *x,
double *w,
long n,
long reset) {
384 return accumulateWeightedMomentsThreaded(mean, rms, standDev, x, w, n, reset, 1);
387long accumulateWeightedMomentsThreaded(
double *mean,
double *rms,
double *standDev,
388 double *x,
double *w,
long n,
long reset,
long numThreads) {
390 static MDB_THREAD_LOCAL
double savedSumW = 0, savedSumWx = 0, savedSumSqrWx = 0;
391 static MDB_THREAD_LOCAL
long savedNTotal;
392 double sumW = savedSumW, sumWx = savedSumWx, sumSqrWx = savedSumSqrWx;
393 long nTotal = savedNTotal;
396 sumW = sumWx = sumSqrWx = nTotal = 0;
402 savedSumSqrWx = sumSqrWx;
403 savedNTotal = nTotal;
407 omp_set_num_threads(numThreads);
408#pragma omp parallel shared(sumW, sumWx, sumSqrWx)
410 double partial_sumW = 0;
411 double partial_sumWx = 0;
412 double partial_sumSqrWx = 0;
414 for (i = 0; i < n; i++) {
415 partial_sumW += w[i];
416 partial_sumWx += w[i] * x[i];
417 partial_sumSqrWx += x[i] * x[i] * w[i];
422 if (numThreads > 1) {
423 sumW += partial_sumW;
424 sumWx += partial_sumWx;
425 sumSqrWx += partial_sumSqrWx;
428 sumWx = partial_sumWx;
429 sumSqrWx = partial_sumSqrWx;
434 *mean = sumWx / sumW;
435 *rms = sqrt(sumSqrWx / sumW);
436 *standDev = sqrt((sumSqrWx / sumW - sqr(*mean)) * (nTotal / (nTotal - 1.0)));
439 savedSumSqrWx = sumSqrWx;
440 savedNTotal = nTotal;
445 savedSumSqrWx = sumSqrWx;
446 savedNTotal = nTotal;
485 double xAve = 0, yAve = 0;
487 *C11 = *C12 = *C22 = 0;
491 omp_set_num_threads(numThreads);
492#pragma omp parallel shared(xAve, yAve)
494 double partial_xAve = 0;
495 double partial_yAve = 0;
497 for (i = 0; i < n; i++) {
498 partial_xAve += x[i];
499 partial_yAve += y[i];
504 if (numThreads > 1) {
505 xAve += partial_xAve;
506 yAve += partial_yAve;
516#pragma omp parallel shared(C11, C12, C22)
518 double partial_C11 = 0;
519 double partial_C12 = 0;
520 double partial_C22 = 0;
522 for (i = 0; i < n; i++) {
523 double dx = x[i] - xAve;
524 double dy = y[i] - yAve;
525 partial_C11 += dx * dx;
526 partial_C12 += dx * dy;
527 partial_C22 += dy * dy;
532 if (numThreads > 1) {
580 omp_set_num_threads(numThreads);
581#pragma omp parallel shared(sum)
583 double partial_sum = 0;
585 for (i = 0; i < n; i++) {
630 omp_set_num_threads(numThreads);
631#pragma omp parallel shared(sum)
633 double partial_sum = 0;
635 for (i = 0; i < n; i++) {
636 partial_sum += y[i] * y[i];
647 return (sqrt(sum / n));
676 double ave = 0, sum = 0;
680 omp_set_num_threads(numThreads);
681#pragma omp parallel shared(ave)
683 double partial_ave = 0;
685 for (i = 0; i < n; i++) {
698#pragma omp parallel shared(sum)
700 double partial_sum = 0;
702 for (i = 0; i < n; i++) {
703 partial_sum += fabs(y[i] - ave);
744 double ySum = 0, wSum = 0;
748 omp_set_num_threads(numThreads);
749#pragma omp parallel shared(wSum, ySum)
751 double partial_wSum = 0;
752 double partial_ySum = 0;
754 for (i = 0; i < n; i++) {
755 partial_wSum += w[i];
756 partial_ySum += y[i] * w[i];
761 if (numThreads > 1) {
762 wSum += partial_wSum;
763 ySum += partial_ySum;
803 double sum = 0, wSum = 0;
807 omp_set_num_threads(numThreads);
808#pragma omp parallel shared(sum, wSum)
810 double partial_sum = 0;
811 double partial_wSum = 0;
813 for (i = 0; i < n; i++) {
814 partial_sum += y[i] * y[i] * w[i];
815 partial_wSum += w[i];
820 if (numThreads > 1) {
822 wSum += partial_wSum;
830 return sqrt(sum / wSum);
862 double mean, sum = 0, wSum = 0;
866 omp_set_num_threads(numThreads);
867#pragma omp parallel shared(sum, wSum)
869 double partial_sum = 0;
870 double partial_wSum = 0;
872 for (i = 0; i < n; i++) {
873 partial_sum += y[i] * w[i];
874 partial_wSum += w[i];
879 if (numThreads > 1) {
881 wSum += partial_wSum;
892#pragma omp parallel shared(sum)
894 double partial_sum = 0;
896 for (i = 0; i < n; i++) {
897 partial_sum += fabs(y[i] - mean) * w[i];
939 double mean, sum = 0, wSum = 0;
943 omp_set_num_threads(numThreads);
944#pragma omp parallel shared(sum, wSum)
946 double partial_sum = 0;
947 double partial_wSum = 0;
949 for (i = 0; i < n; i++) {
950 partial_sum += y[i] * w[i];
951 partial_wSum += w[i];
956 if (numThreads > 1) {
958 wSum += partial_wSum;
969#pragma omp parallel shared(sum)
971 double partial_sum = 0;
973 for (i = 0; i < n; i++) {
974 double value = y[i] - mean;
975 partial_sum += value * value * w[i];
986 return sqrt((sum * n) / (wSum * (n - 1.0)));
double arithmeticAverage(double *y, long n)
Calculates the arithmetic average of an array of doubles.
double weightedStDevThreaded(double *y, double *w, long n, long numThreads)
Calculates the weighted standard deviation of an array of doubles using multiple threads.
double standardDeviationThreaded(double *x, long n, long numThreads)
Calculates the standard deviation of an array of doubles using multiple threads.
long computeWeightedMoments(double *mean, double *rms, double *standDev, double *meanAbsoluteDev, double *x, double *w, long n)
Computes weighted statistical moments of an array.
long computeWeightedMomentsThreaded(double *mean, double *rms, double *standDev, double *meanAbsoluteDev, double *x, double *w, long n, long numThreads)
Computes weighted statistical moments of an array using multiple threads.
double weightedStDev(double *y, double *w, long n)
Calculates the weighted standard deviation of an array of doubles.
double rmsValueThreaded(double *y, long n, long numThreads)
Calculates the RMS (Root Mean Square) value of an array of doubles using multiple threads.
long computeMoments(double *mean, double *rms, double *standDev, double *meanAbsoluteDev, double *x, long n)
Computes the mean, RMS, standard deviation, and mean absolute deviation of an array.
double arithmeticAverageThreaded(double *y, long n, long numThreads)
Calculates the arithmetic average of an array of doubles using multiple threads.
double weightedRMSThreaded(double *y, double *w, long n, long numThreads)
Calculates the weighted RMS (Root Mean Square) value of an array of doubles using multiple threads.
long computeCorrelationsThreaded(double *C11, double *C12, double *C22, double *x, double *y, long n, long numThreads)
Computes the correlations between two datasets using multiple threads.
double meanAbsoluteDeviationThreaded(double *y, long n, long numThreads)
Calculates the mean absolute deviation of an array of doubles using multiple threads.
long computeCorrelations(double *C11, double *C12, double *C22, double *x, double *y, long n)
Computes the correlations between two datasets.
long computeMomentsThreaded(double *mean, double *rms, double *standDev, double *meanAbsoluteDev, double *x, long n, long numThreads)
Computes the mean, RMS, standard deviation, and mean absolute deviation of an array using multiple th...
double weightedMADThreaded(double *y, double *w, long n, long numThreads)
Calculates the weighted mean absolute deviation of an array of doubles using multiple threads.
double meanAbsoluteDeviation(double *y, long n)
Calculates the mean absolute deviation of an array of doubles.
double weightedMAD(double *y, double *w, long n)
Calculates the weighted mean absolute deviation of an array of doubles.
double weightedRMS(double *y, double *w, long n)
Calculates the weighted RMS (Root Mean Square) value of an array of doubles.
double rmsValue(double *y, long n)
Calculates the RMS (Root Mean Square) value of an array of doubles.
double weightedAverageThreaded(double *y, double *w, long n, long numThreads)
Calculates the weighted average of an array of doubles using multiple threads.
double weightedAverage(double *y, double *w, long n)
Calculates the weighted average of an array of doubles.
double standardDeviation(double *x, long n)
Calculates the standard deviation of an array of doubles.