如何减少(x,y)数据中的点数

时间:2010-04-12 16:39:24

标签: algorithm reduction

我有一组数据点:

(x1, y1) (x2, y2) (x3, y3) ... (xn, yn)

样本点的数量可以是数千。我希望尽可能准确地表示相同的曲线,并使用最小的(假设为30个)点集。我想捕捉尽可能多的拐点。但是,我对表示数据的允许点数有严格的限制。

实现相同目标的最佳算法是什么?有没有可以提供帮助的免费软件库?

PS:我试图实现基于相对斜率差异的点消除,但这并不总能产生最佳的数据表示。

3 个答案:

答案 0 :(得分:1)

您正在搜索插值算法。您的点集是否是数学意义上的函数(所有x值彼此不相交)然后您可以进行多项式插值,或者它们是否分布在2d平面上,然后您可以使用贝塞尔曲线。

答案 1 :(得分:1)

多年后的迟到答案:
看看Douglas-Peucker algorithm

function DouglasPeucker(PointList[], epsilon)
    // Find the point with the maximum distance
    dmax = 0
    index = 0
    end = length(PointList)
    for i = 2 to ( end - 1) {
        d = perpendicularDistance(PointList[i], Line(PointList[1], PointList[end])) 
        if ( d > dmax ) {
            index = i
            dmax = d
        }
    }
    // If max distance is greater than epsilon, recursively simplify
    if ( dmax > epsilon ) {
        // Recursive call
        recResults1[] = DouglasPeucker(PointList[1...index], epsilon)
        recResults2[] = DouglasPeucker(PointList[index...end], epsilon)

        // Build the result list
        ResultList[] = {recResults1[1...length(recResults1)-1], recResults2[1...length(recResults2)]}
    } else {
        ResultList[] = {PointList[1], PointList[end]}
    }
    // Return the result
    return ResultList[]
end

它经常用于简化GPS轨迹并减少航点数量。作为准备工作,您可能必须对点进行排序以存储列表或数组中相邻的邻居点。

答案 2 :(得分:0)

它取决于你的曲线必须与每个点相交或它是近似值。尝试:

  1. 拿点
  2. 应用任何插值(http://en.wikipedia.org/wiki/Polynomial_interpolation)以获得曲线方程
  3. 然后采取具体步骤的样本点。