PHP中的插值

Fre*_*red 6 php interpolation

我正在寻找PHP中的一个函数,用于将一组不规则放置的数据(x,y,z)插入到网格化数据集中,以便在JPGraph的ContourPlot函数中使用它.我已经开发了一个基于简单的逆距离加权的函数,但它太慢了.我需要使用其他方法,如"修改的Shepard方法"或任何其他可能的方法,更准确,使其更快,更顺畅.

这是我目前的代码:

for($i = 0, $ij = 0; $i < $gridX; $i ++) {
    for($j = 0; $j < $gridY; $j ++, $ij ++) {
        $x = $startP->x + ($deltaX * $i);
        $y = $startP->y + ($deltaY * $j);
        $g [$ij]->i = $i;
        $g [$ij]->j = $j;
        $g [$ij]->x = ( int ) $x;
        $g [$ij]->y = ( int ) $y;
        $g [$ij]->z = IDW_U ( $x, $y, $sampleData, $sampleSize, $p );
    }
}

function IDW_U($x, $y, $data, $size, $p) {
    $idw_sum = IDWeightSum ( $x, $y, $data, $size, $p );
    $idw_u = 0.0;
    for($k = 0; $k < $size; $k ++) {
        if ($x == $data [$k]->x && $y == $data [$k]->y)
            return $data [$k]->z;
        $idw_u += IDWeight ( $x, $y, $data [$k], $p ) * $data [$k]->z / $idw_sum;
    }
    return $idw_u;
}

function IDWeightSum($x, $y, $data, $size, $p) {
    $sum = 0.0;
    for($k = 0; $k < $size; $k ++)
        $sum += IDWeight ( $x, $y, $data [$k], $p );
    return $sum;
}

function IDWeight($x, $y, $d, $p) {
    if ($x == $d->x && $y == $d->y)
        return 1.0;
    $dx = $x - $d->x;
    $dy = $y - $d->y;
    $ret = 1.0 / pow ( sqrt ( pow ( $dx, 2 ) + pow ( $dy, 2 ) ), $p );
    return $ret;
}
Run Code Online (Sandbox Code Playgroud)

有人知道可用于此目的的功能或库吗?

小智 1

我不确定 PHP 是否是此类数学密集型功能的不错选择。然而,有很多可用的图形库,其中的代码已经过优化,放入 DLL 等中。

我们使用高级软件工程 ChartDirector PHP 图表来绘制一些相当复杂的图表,而且速度很快。我不确定它是否包含您感兴趣的算法,但它确实包含一些像 LOWESS 的算法。我看到的主要问题是您正在处理 X、Y 和 Z。处理第三维并不是最常见的功能。我不确定这个库是否真的支持......