Objective-C:NSNumber对象的平滑NSArray

时间:2011-10-14 06:10:24

标签: objective-c ios loops nsarray nsnumber

我有一个包含大量NSNumber对象(数千个)的NSArray。我使用这些数字来构建一个漂亮的折线图。问题是,图表使用了每个值,这使得图表非常清晰。我拥有的价值越多,情况就越糟糕:

enter image description here

我希望能够将它变成更平滑的图形,可能会抛出那些让它看起来像锯齿状的数字。我希望它看起来像这样:

enter image description here

也许已经晚了,但我并没有想办法做到这一点。可能会循环我的价值观并把它们中的一些扔出去?图表不需要100%准确,它只需要是值的正确表示。

修改

这是我使用jrturton的答案提出的方法:

- (NSArray *)smoothedArray:(NSArray *)items {

    int average = 0;
    int i = 0;
    int numberToAverageBy = 10;

    NSMutableArray *newItems = [[[NSMutableArray alloc] init] autorelease];
    // Loop
    for (NSNumber *elevation in items) {

        average += [elevation intValue];
        i++;

        if (i == numberToAverageBy) {
            [newItems addObject:[NSNumber numberWithInt:average/numberToAverageBy]];
            i = 0;
            average = 0;
        }//end
    }//end for

    return [NSArray arrayWithArray:newItems];

}//end

它完美无缺!

4 个答案:

答案 0 :(得分:3)

查看移动平均线。

移动平均线越短,它越接近曲线,但它会平滑。

例如,在这里查看10天指数移动平均线:

http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

答案 1 :(得分:3)

您可以获取数组中每10个(或您选择的任何)元素的平均值,并使用它来确定要绘制的点。这样可以使绘图更快。

答案 2 :(得分:1)

我以前从来没有做过这样的事情,所以我相信其他人可以提出更优雅的解决方案,但这就是我想要的尝试:

在显示图形之前,为什么不将每个元素设置为它周围某些元素的平均值,而不是丢弃一些元素?例如,如果您的数组包含(2,1,3,5,4,3,8),那么它将变为(2,2,3,4,4,5,8)。为了获得这些值,我取每个元素及其直接邻居的平均值来获得新元素(除了endcaps,我保留原样)。在每个步骤中使用您平均在一起的元素数量,可以使图形看起来像您想要的那样平滑。

答案 3 :(得分:0)