Interpolation in PHP
Ich bin auf der Suche nach einer Funktion in PHP, die für die Interpolation einer Reihe von unregelmäßig Platzierten Daten (x,y,z) ein raster-DataSet für die Verwendung in ContourPlot der Funktion in JPGraph. Ich habe eine entwickelte Funktion basiert auf einfachen Inverse Distanz Gewichtung, aber es ist zu langsam. Muss ich eine andere Methode verwenden, wie "Modifizierte Shepard-Methode" oder anderen Methoden möglich, mit mehr Genauigkeit, um es schneller und reibungsloser.
Hier ist mein Derzeitiger code:
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;
}
Weiß jemand eine Funktion oder Bibliothek für diesen Zweck zur Verfügung?
- Poste deinen code, der ist zu langsam. Möglicherweise gibt es einige signifikante Optimierungen möglich...
- Hmm, ich denke
gnuplot
können ziemlich viel interpolieren und erzeugen die gleiche Qualität (oder besser) wie JPGraph. Vielleicht ist das eine option? Art eine steile Lernkurve, aber ich kann sicher sagen, ich weiß nicht, 2% von dem, was gnuplot nicht kann. - Dieses Kopfgeld kann Ihnen helfen, einige Antworten.
- Dies nicht anzugehen, das eigentliche problem, sondern die Sie interessieren können, der in Facebook ist HipHop das beschleunigt PHP durch das kompilieren in systemeigenen code. developers.facebook.com/blog/post/358
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bin ich nicht sicher, dass PHP wäre eine gute Wahl für die Mathematik-intensive Funktionen, wie das. Jedoch, es gibt eine Menge von Zeichnungs-Bibliotheken zur Verfügung, wo der code wurde optimiert, in DLL ' s und Dinge wie, dass.
Wir haben die Erweiterten Software-Engineering ChartDirector PHP Charting - für einige ziemlich komplexe Grafiken und es ist schnell. Ich weiß es nicht sicher, wenn der Algorithmus, der Sie interessiert, aber es enthält einige wie LOWESS. Das Hauptproblem, das ich sehe, ist, dass Sie es mit X, Y, und Z. Der Umgang mit der Dritten dimension ist nicht die häufigste Funktion. Ich bin nicht sicher, dass diese Bibliothek tatsächlich unterstützen, dass...
Soweit ich sehen kann, IDWeight heißt ziemlich oft. Sie konnte die Hälfte der Anzahl der Anrufe an, die durch die Berechnung IDW_U so:
Ich denke, das Hauptproblem ist, dass für die Berechnung eines pixels, werden alle datasets werden verwendet, während die meisten von Ihnen haben nur geringe Auswirkungen. Sie könnte wirklich eine Steigerung der performance durch Aufteilung der Daten in kleine Bereiche, und berechnen Sie alle Bereiche separat.
Wenn Sie sind nicht gebunden an PHP-haben, sollten Sie sich der Wechsel Weg von es für des so intensive Verarbeitung wie Sie können. PHP ist eine langsamere Sprache (Letzte mal sah ich - vor etwa einem Jahr, sowohl Python und Ruby übertraf es, ebenso wie C, C++ und Java.
Also durch den Wechsel zu einem off-line-Grafik-tool (wie z.B. gnuplot, wie erwähnt, in den Kommentaren), erneut ausführen Ihre performance-tests und, falls nötig, schalten Sie den Algorithmus, um ein Python-oder Ruby-Skript oder ein kompiliertes C oder C++ - Anwendung, die Sie erhalten würden, eine Leistung zu steigern.
Allerdings, ich konnte nicht mehr die jüngsten performance-Daten auf PHP im Vergleich zu anderen Sprachen seit Ende 2008/Anfang 2009 - meine Daten möglicherweise nicht mehr wahr.
Könnte es helfen, Sie übergeben die Daten per Referenz: