Verfasst am: 23.06.2014, 15:01
Titel: Fläche zwischen Punktewolke interpolieren
Hallo Leute,
hoffentlich könnt ihr mir weiterhelfen. Ich habe in Matlab eine Punktewolke erzeugt und nun muss ich eine Fläche in diese Punktewolke legen (interpolieren), die zu allen Punkten den gleichen Abstand hat. Die Fläche muss nicht jeden einzelnen Punkt berühren.
Mein Kennfeld, aus dem Die Punktewolke erzeugt wird sieht wie folgt aus
y/x 449 499 549 599
Verfasst am: 24.06.2014, 09:46
Titel: Re: Fläche zwischen Punktewolke interpolieren
Hallo,
es wäre gut, wenn du deine Daten in ein matlab-konformes Format bereistellen würdest, sodass man nur noch copy&pasten muss, ohne viel Handarbeit erledigen zu müssen.
Avaya hat Folgendes geschrieben:
Hallo Leute,
hoffentlich könnt ihr mir weiterhelfen. Ich habe in Matlab eine Punktewolke erzeugt und nun muss ich eine Fläche in diese Punktewolke legen (interpolieren), die zu allen Punkten den gleichen Abstand hat. Die Fläche muss nicht jeden einzelnen Punkt berühren.
Mir sind deine zwei Bedingungen nicht ganz klar. Typischer Weise fürde man durch dein Kennfeld bilinear interpolieren, um den Wert für Koordinatenpaare, die man nicht tabelliert hat, zu schätzen. Daraus kann man dann eine Fläche plotten.
Wenn das aber nicht das ist, was du möchtest, dann musst du deine Bedingungen zumindest für mich noch mal genauer darstellen (man kann beispielsweise im 3-dimensionalen Raum im Allgemeinen gar nicht den gleichen Abstand zu 20 Punkten haben.
Im Anhang habe ich einmal die Punktewolke eingefügt, um die es sich handelt. Die grüne Fläche ist dabei zu vernachlässigen.
Ich habe die 3 Zeilenvektoren x,y,z mit einer Länge von 1302.
Aus diesen 3 Vektoren bildet sich die Punktewolke.
Die Aufgabe ist nun in diese Punktewolke eine Fläche zu legen, die möglichst gut in der Mitte der Punktewolke liegt. Wichtig ist, dass die Fläche nicht eben sein muss.
Code:
x = [672.2169672.8515471.5271469.4728521.5627538.4499711.3514713.2216];
y = [59.444959.617014.577114.824172.654873.025020.579785.4878];
z = [82.181.775.311.863.534.397.9104.4];
Das sind nur Auszüge von meinen Messwerten. Das Problem ist, dass es keine direkte Funktion gibt, wie diese Werte zusammenhängen. Es sind halt Messwerte.
ich denke nicht, dass es dafür etwas vorgefertigtes gibt, kann mich aber irren.
Ein Vorschläg wäre, deine x,y-Ebene in zweidimensionale Bins zu unterteilen und von den Datenpunkten, die in den Bins liegen, den Mittelwert (oder ggf. den Median) zu berechnen. Diese Werte könntest du dann als Fläche verbinden. Das führt aber auf Probleme: Was ist, wenn ein Bin leer ist oder wenn vielleicht nur ein oder zwei Messwerte drin liegen? Dann könnte man vielleicht das Bin vergrößern oder ähnliches.
Falls du auf eine vorgefertigte Lösung stößt, dann schreib das bitte auch hier rein, zumindest mich interessiert das (da ich schon mal ein ähnliches Problem hatte und das wie oben beschrieben gelöst habe).
Viele Grüße,
Nras.
Edit: eigentlich bin ich doch der Meinung, dass es da vorgefertigte Sachen geben müsste, irgendwas mit smoothing 3d data, filtering 3d data mal googeln.
vielen Dank für deine Hilfe. Ich habe es ohne Toolbox gemacht, aber ich gebe dir recht irgendetwas muss es da geben, um solche Probleme zu lösen.
Ich habe es letztendlich über ein Konstrukt aus Schleifen und if-Anweisungen aufgebaut.
Kennst du vielleicht eine Möglichkeit die Fläche aus dem Anhang stetig zu machen.
deine Fläche sieht aber nun nicht so aus, als würde sie "mittig" zwischen den Punkten liegen. Das sieht eher so aus, als läge sie fast immer drüber. Ich sehe da nur bei dem rotne Bereich einen Punkt, der mal über der Fläche liegt.
Was meinst du mit "stetig" bei der Fläche? Die ist ja stetig, aber aber Kanten, sodass sie nicht gerade differenzzierbar aussieht. Wenn du das gerne weniger eckig haben möchtest, dann benötigst du mehr Stützstellen.
Also sie liegt überall über den Punkten, der eine ist bloß ein kleiner Grafikfehler. Ich habe die mittigliegende Fläche nach oben verschoben.
Ja ich meinte differenzierbar. Ich dachte es gibt eine Interpolationsmethode die eine Fläche mit glatten Übergängen ohne Kanten erzeugen kann.
hat mir geholfen und auch geklappt die Fläche sieht viel besser aus.
Doch es hat sich gleich die nächste Frage ergeben.
Gibt es einen Code um x, y und z-werte meiner Fläche an einer beliebigen Stelle abzurufen und in Matlab weiterzuverwenden.
Zu sehen ist zum Beispiel in der Grafik ein Punkt, dessen werte ich gerne in Matlab verwenden würde, ohne sie händisch einzutragen und den Punkt mit dem Data Cursor anwählen zu müssen.
Vielleicht hat jemand ja schonmal gehört, dass so etwas machbar ist.
das verstehe ich nicht ganz. Irgendwie musst du den Punkt ja auswählen (also x und y Koordinaten vorgeben).
Den zugehörigen Z-Wert kannst du mit interp2() finden, falls die x und y Werte, die du auslesen willst auch mal zwischen tabellierten x und y Werten liegen. Ansonsten geht das auch mit logischer Indizierung. Beispiel:
Code:
% Daten erzeugen
X = 2:0.25:4;
Y = 4:0.5:11;
[X,Y] = meshgrid(X,Y);
Z = sin(X).*cos(Y);
figure surf(X,Y,Z)
% auslesen an der Stelle (x,y)
x = 3.5;
y = 4.5;
z = Z(X==x & Y==y)% funktioniert nur für exakt tabellierte Werte
z = interp2(X,Y,Z,x,y)% funktioniert für exakt tabellierte Werte...
z = interp2(X,Y,Z,x+0.1,y)% ...und für nicht exakt tabellierte Werte
Zu sehen ist zum Beispiel in der Grafik ein Punkt, dessen werte ich gerne in Matlab verwenden würde, ohne sie händisch einzutragen und den Punkt mit dem Data Cursor anwählen zu müssen.
Im zweidimensionalen Fall könntest du ginput() verwendet, im 3dimensionalen Fall, so wie hier, nicht. Das ginge mit imagesc() als plot-Befehl, statt surf(), aber dann muss man mit dem Rotieren aufpassen. Alternativ im fileexchange mal nach ginput3d() oder so ähnlich suchen, da gibt es was...
Ja mein Problem ist, dass die Punkte (x,y), zu denen ich den z-Wert identifizieren muss, alle zwischen meinen tabellierten Werten liegen.
Von ginput() hab ich auch schon gehört, aber das ist hier ja leider nicht möglich, ich werde einmal nach den Dingen suchen, die du vorgeschlagen hast.
Gruß
Avaya
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.