Obj-C:计算NSNumber对象的NSArray的标准偏差?

Cla*_*lay 11 cocoa objective-c

如果我有一个NSArrayNSNumber对象,我怎么计算数组中的数字的标准偏差?

Tom*_*mmy 24

假设将所有NSNumber作为双倍长度浮点数进行处理是安全的(如果你在该范围的极端有一些64位整数,那么你将失去一些精度)并且我已经正确地记住了公式,第一个实现可能是:

- (NSNumber *)meanOf:(NSArray *)array
{
    double runningTotal = 0.0;

    for(NSNumber *number in array)
    {
        runningTotal += [number doubleValue];
    }

    return [NSNumber numberWithDouble:(runningTotal / [array count])];
}

- (NSNumber *)standardDeviationOf:(NSArray *)array
{
    if(![array count]) return nil;

    double mean = [[self meanOf:array] doubleValue];
    double sumOfSquaredDifferences = 0.0;

    for(NSNumber *number in array)
    {
         double valueOfNumber = [number doubleValue];
         double difference = valueOfNumber - mean;
         sumOfSquaredDifferences += difference * difference;
    }

    return [NSNumber numberWithDouble:sqrt(sumOfSquaredDifferences / [array count])];
}
Run Code Online (Sandbox Code Playgroud)


Tia*_*ago 24

您可以使用NSExpression内置函数.

NSArray *numbers = @[@1, @2, @3, @4, @5, @6, @7, @8];
NSExpression *expression = [NSExpression expressionForFunction:@"stddev:" arguments:@[[NSExpression expressionForConstantValue:numbers]]];
NSNumber *value = [expression expressionValueWithObject:nil context:nil];
NSLog(@"%@,", value); // => 2.29128...
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看官方文档和此NSHipster文章.