我很好奇我的标准偏差方法是否可以提高效率。通过有效我的意思是快速,并且快速意味着从方法调用到方法返回的延迟。
以下是代码:
public double stdDev(ArrayList<Double> input) {
double Nrecip = ( 1.0 / ( input.size()) );
double sum = 0.0;
double average = 0.0;
for (Double input : inputs) {
average += input;
} average *= Nrecip;
for (Double input : inputs) {
sum += ( (input - average)*(input - average) );
} sum *= Nrecip;
return Math.sqrt(sum);
}
我很感激任何建议。
答案 0 :(得分:4)
您可以一次性计算标准偏差。使用double[]
也会更有效。
public static double stdDev(double... a) {
double sum = 0;
double sq_sum = 0;
for (int i = 0; i < n; ++i) {
double ai = a[i];
sum += ai;
sq_sum += ai * ai;
}
double mean = sum / n;
double variance = sq_sum / n - mean * mean;
return Math.sqrt(variance);
}
此解决方案的转换in C here
传递内存一次可以提高性能。
答案 1 :(得分:0)
使用org.apache.commons.math3.stat.descriptive
public double stdDev(ArrayList<Double> input) {
DescriptiveStatistics ds = new DescriptiveStatistics(input.toArray(new Double[0]));
return ds.getStandardDeviation();
}