Estoy buscando una función en PHP para interpolar un conjunto de datos colocados irregulares (x, y, z) a un conjunto de datos de cuadrícula para usarlo en la función ContourPlot en JPGraph. Desarrollé una función basada en el simple Inverse distance weighting, pero es demasiado lenta. Necesito utilizar otro método como "Método de Shepard modificado" o cualquier otro método posible con más precisión para que sea más rápido y sencillo.Interpolación en PHP
Aquí está mi código actual:
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;
}
¿Alguien sabe una función o una biblioteca disponible para este propósito?
Publique su código que es demasiado lento. Puede haber algunas optimizaciones significativas posibles ... – ircmaxell
Hmm, creo que 'gnuplot' puede interpolar y generar la misma calidad (o mejor) que JPGraph. Tal vez esa es una opción? Aunque una especie de curva de aprendizaje empinada, puedo decir con seguridad que no sé el 2% de lo que puede hacer el gnuplot. – Wrikken
Esta recompensa podría ayudarte a obtener algunas respuestas. –