Интерполяция в PHP - PullRequest
       0

Интерполяция в PHP

6 голосов
/ 22 июля 2010

Я ищу функцию в PHP для интерполяции набора нерегулярно размещенных данных (x, y, z) в набор данных с сеткой для использования его в функции ContourPlot в JPGraph.Я разработал функцию, основанную на простом обратном весе , но она слишком медленная.Мне нужно использовать другой метод, такой как «Модифицированный метод Шепарда» или любые другие возможные методы с большей точностью, чтобы сделать его быстрее и плавнее.

Вот мой текущий код:

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;
}

Кто-нибудьзнаете функцию или библиотеку, доступную для этой цели?

Ответы [ 4 ]

3 голосов
/ 27 июля 2010

Насколько я вижу, IDWeight вызывается довольно часто.Вы могли бы вдвое уменьшить количество обращений к этому, рассчитав IDW_U следующим образом:

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

Я думаю, что основная проблема заключается в том, что для вычисления одного пикселя используются все наборы данных, в то время как большинство из них будет иметьнебольшое влияние.Вы действительно можете повысить производительность, разбив данные на небольшие области и рассчитав все области по отдельности.

1 голос
/ 26 июля 2010

Я не уверен, что PHP будет хорошим выбором для такой интенсивной математической функциональности.Тем не менее, существует множество графических библиотек, где код был оптимизирован, помещен в DLL и тому подобное.

Мы использовали Advanced Software Engineering ChartDirector PHP Charting для некоторых довольно сложных графиков, и это быстро.Я не знаю наверняка, включает ли он интересующий вас алгоритм, но он включает в себя и такие, как LOWESS.Основная проблема, которую я вижу, заключается в том, что вы имеете дело с X, Y и Z. Обработка третьего измерения - не самая распространенная особенность.Я не уверен, что эта библиотека на самом деле будет поддерживать это ...

0 голосов
/ 26 июля 2010

Это может помочь вам передать данные по ссылке:

 function IDW_U($x, $y, &$data, $size, $p) ...
 function IDWeightSum($x, $y, &$data, $size, $p) ...
0 голосов
/ 25 июля 2010

Если вы не привязаны к PHP, вам следует подумать о том, чтобы от него отказаться, чтобы максимально интенсивно обрабатывать.PHP - более медленный язык (в прошлый раз я смотрел - около года назад и Python, и Ruby превзошли его, а также C, C ++ и Java.

Итак, переключившись на инструмент для автономного построения графиковтакие как gnuplot, как упомянуто в комментариях), перезапуск тестов производительности и, при необходимости, переключение алгоритма на скрипт Python или Ruby или скомпилированное приложение C или C ++, вы получите повышение производительности.Однако с конца 2008 года по начало 2009 года я не смог найти более свежие данные о производительности по сравнению с другими языками - мои данные могут больше не соответствовать действительности.

...