我有这个方法来计算一个NSNumber整数数组的标准差,给出一个平均值。计算使用NSDecimals保持最高分辨率。这是目前要求许多cpu周期,任何帮助,以加快它同时保持所需的分辨率是赞赏的!谢谢您。

-(NSDecimal)standardDeviationOf:(NSMutableArray *)array withMean:(NSDecimal)mean {

if (![array count]) return CPTDecimalFromInt(0);

NSDecimal sumOfSquaredDifferences = CPTDecimalFromInt(0);


for (NSNumber *number in array) {

    NSDecimal valueOfNumber = CPTDecimalFromInt([number intValue]);
    NSDecimal difference = CPTDecimalSubtract(valueOfNumber, mean);
    sumOfSquaredDifferences = CPTDecimalAdd(sumOfSquaredDifferences, CPTDecimalMultiply(difference, difference));

}

return CPTDecimalFromDouble(
                            sqrt(
                                 CPTDecimalDoubleValue(sumOfSquaredDifferences) / [[NSNumber numberWithInt:[array count]] doubleValue]
                                 )
                            );
}

最佳答案

NSDecimal的精度为38位,而double的精度约为16位。但是在循环结束时,当您将sumOfSquaredDifferences转换为double函数时,您在sqrt中拥有的所有额外精度都将“丢失”。您也可以使用NSDecimal来执行内部循环的运算,它应该比double快得多:

double sumOfSquaredDifferences = 0;
double valueOfMean = [mean doubleValue];
for (NSNumber *number in array) {

    double valueOfNumber = [number intValue];
    double difference = valueOfNumber - valueOfMean;
    sumOfSquaredDifferences += difference * difference;

}

return CPTDecimalFromDouble(sqrt(sumOfSquaredDifferences /
                                 double([array count])));

关于objective-c - 加快此标准偏差方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11027035/

10-09 02:44