2014-12-01 2 views
6

Ich versuche, die durchschnittliche Zellengröße auf die folgende Menge von Punkten zu berechnen, wie auf dem Bild zu sehen: grid. Das Bild wurde mit gnuplot erzeugt:Computing durchschnittliche Rastergröße

Die Punkte sind fast auf einem rechteckigen Raster ausgerichtet, aber nicht ganz. Es scheint eine Verzerrung (Jitter?) Von etwa 10-15% entlang von X oder Y zu geben. Wie würde man effizient eine richtige Partition in Kacheln berechnen, so dass nur ein Punkt pro Kachel ausgedrückt würde (Fliese, Fliesen). Ich verwende das Wort virtuell, da die 10-15% -Bias einen Punkt in einer anderen benachbarten Kachel verschoben haben kann.

nur als Referenz, habe ich manuell sortiert (hoffentlich korrekt) und extrahiert die ersten 10 Punkte:

-133920,33480 
-132480,33476 
-131044,33472 
-129602,33467 
-128162,33463 
-139679,34576 
-138239,34572 
-136799,34568 
-135359,34564 
-133925,34562 

Nur zur Klarstellung, eine gültige Fliese gemäß der obigen Beschreibung würde (1435,1060), aber ich bin wirklich auf der Suche nach einem schnellen automatisierten Weg.

+0

'1. Finden Sie die Delaunay-Triangulation. 2. Entferne die diagonalen Linien. "Was bleibt, ist im Wesentlichen das, was du willst oder zumindest ziemlich helfend sein wirst. Nimmt O (N log N). – Nuclearman

+0

Welche diagonalen Linien? – NaCl

+1

Die Triangulation eines ungefähren Gitters erzeugt Linien, die ungefähr horizontal, vertikal und diagonal sind. Die horizontalen und vertikalen sind in diesem Fall eindeutig nützlich, aber die diagonalen sind wahrscheinlich nicht und werden daher am besten entfernt. Das Ergebnis ist ein Gitterdiagramm, mit dem Sie den nächstliegenden Punkt direkt nach links, rechts, oben oder unten an einem bestimmten Punkt finden können. Diese Datenstruktur sollte ausreichen, um alles zu tun, was in O (N) benötigt wird. Zum Beispiel können Sie alle Punkte in einer Spalte finden, indem Sie von einem Punkt oder einer Reihe aus nach links oder rechts gehen. – Nuclearman

Antwort

1

einzigem dies für X-Koordinate Lassen Sie tun:

1) sortieren Sie die X-Koordinaten

2) zu buchen, Deltas zwischen zwei aufeinanderfolgenden X-Koordinaten. Diese Delta wird in zwei Kategorien unterteilt - entweder entsprechen sie den Abständen zwischen zwei Spalten oder zwischen den Kreuzen innerhalb derselben Spalte. Ihr Ziel ist es, eine Schwelle zu finden, die die langen von den kurzen trennt. Dies kann durch Auffinden eines Schwellenwerts erreicht werden, der die Deltas in zwei Gruppen trennt, deren Mittel am weitesten voneinander entfernt sind (denke ich).

3) Sobald Sie die Schwelle haben, trennen Sie die Punkte in Spalten. Sie gemessen zuvor

4) berechnen mittlere Position jedes detektierten Spalte

5) nehmen Deltas zwischen aufeinanderfolgenden Spalten Spalten A beginnt und endet mit einem Delta auf den Schwellenwert entspricht. Nun, das Problem ist, dass Sie einen Streupunkt bekommen, der Ihre Spalten brechen würde. Verwende einen Median, um die Streuner zu eliminieren.

6) Sie sollten eine robuste Schätzung Ihrer gridx haben

Beispiel, um Ihre Daten, mit Blick auf X-Achse:

-133920 -132480 -131044 -129602 -128162 -139679 -138239 -136799 -135359 -133925 

Sortiert + Deltas:

5 1434 1436 1440 1440 1440 1440 1440 1442 

Sie hier kann sehen, dass es einen sehr offensichtlichen Schwellenwert zwischen klein (5) und groß (1434 und höher) Delta gibt.

-139679|-138239|-136799|-135359|-133925 -133920|-132480|-131044|-129602|-128162 
     1440 1440 1440 1434  5 1440 1436 1442 1440 

Fast alle Punkte sind allein, mit Ausnahme der beiden -133.925 -133.920: 1434 wird Ihr Platz hier

Split die Punkte in Spalten definieren.

Die durchschnittlichen Rasterlinie Positionen sind:

-139679 -138239 -136799 -135359 -133922.5 -132480 -131044 -129602 -128162 

Sortiert Deltas:

1436.0 1436.5 1440.0 1440.0 1440.0 1440.0 1442.0 1442.5 

Median:

1440 

, die für Ihre SMALL Datensatz, IMHO ist die richtige Antwort.