WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Fläche zwischen Punktewolke interpolieren

 

Avaya
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2014, 15:01     Titel: Fläche zwischen Punktewolke interpolieren
  Antworten mit Zitat      
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

20 50 85 110 40
30 52 53 66 74
35 62 55 58 54
40 65 37 71 50

Wisst ihr vielleicht eine Möglichkeit, wie man das anstellen könnte.
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 24.06.2014, 09:46     Titel: Re: Fläche zwischen Punktewolke interpolieren
  Antworten mit Zitat      
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.
Code:
cols = [449 499 549 599];
rows = [20, 30, 35, 40];
data= [50 85 110 40
    52 53 66 74
    62 55 58 54
    65 37 71 50];

CI = 449:10:599;
RI = 20:40;
[CI, RI] = meshgrid(CI, RI);
data_i = interp2(cols, rows, data, CI, RI);
figure
[C, R] = meshgrid(cols, rows);
plot3(C,R,data,'ko','markerfacecolor','black')
hold on
surf(CI, RI, data_i)

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.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avaya
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2014, 09:28     Titel:
  Antworten mit Zitat      
Vielen Dank Nras schon einmal für die Antwort.

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.2169 672.8515 471.5271 469.4728 521.5627 538.4499 711.3514 713.2216];
y = [59.4449 59.6170 14.5771 14.8241 72.6548 73.0250 20.5797 85.4878];
z = [82.1 81.7 75.3 11.8 63.5 34.3 97.9 104.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 hoffe das hilft ein bisschen weiter.

Gruß Avaya

Punktewolke.JPG
 Beschreibung:
Zur Veranschaulichung meines Problems

Download
 Dateiname:  Punktewolke.JPG
 Dateigröße:  256.82 KB
 Heruntergeladen:  350 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 25.06.2014, 12:35     Titel:
  Antworten mit Zitat      
Hallo,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avaya
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2014, 10:38     Titel:
  Antworten mit Zitat      
Hi Nras,

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.

MfG Avaya

Grenzkatflaeche.JPG
 Beschreibung:

Download
 Dateiname:  Grenzkatflaeche.JPG
 Dateigröße:  192.12 KB
 Heruntergeladen:  342 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 08.07.2014, 10:43     Titel:
  Antworten mit Zitat      
Hallo,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avaya
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2014, 13:54     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 08.07.2014, 13:58     Titel:
  Antworten mit Zitat      
Hallo,

ach so. Zur Lösung: mehr Stützstellen beim erstellen der Fläche benutzen oder nachträglich interpolieren mit interp2() oder griddata().

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avaya
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2014, 16:57     Titel:
  Antworten mit Zitat      
Hey danke,

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.

Gruß
Avaya

WertausFlaeche.JPG
 Beschreibung:

Download
 Dateiname:  WertausFlaeche.JPG
 Dateigröße:  237.5 KB
 Heruntergeladen:  307 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 14.07.2014, 17:56     Titel:
  Antworten mit Zitat      
Hallo,

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


Edit:
Jetzt verstehe ich glaube ich diesen Satz:
Zitat:
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...



Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Avaya
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2014, 10:00     Titel:
  Antworten mit Zitat      
Ok vielen Dank, das werde ich einmal probieren.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.