Verfasst am: 07.03.2013, 14:04
Titel: Aus Schleifen-Werten Grafik erstellen
Hallo aus Niederbayern!
Verweg bin ich blutiger Matlab-Neuling. Aber versuche grad ein "Programm" zu schreiben, indem zwei Schleifen ein xy-Raster abfährt und dabei jeweils 2 z-werte berechnet.
Die beiden separaten z-Werte sollen mit den jeweiligen x - und y- Werten zwischengespeichert werden und nach ablauf der Schleifen, als mesh oder surf angezeigt werden.
Ich konnte schon einen plot3 erzeugen indem ich die Punkte bei jedem Schleifendurchlauf direkt zeichnen ließ, aber diese Lösung war nicht sehr 'elegant' und 'unschön'.
Bin am verzweifeln, weil nix mehr klappt. Wäre super, wenn mir jemand weiterhelfen könnte.
Vielen Dank voraus.
gruss Bernd
Bernd_123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.03.2013, 14:09
Titel:
ach ja, das ist mein aktueller Ansatz, den ich hier gefunden habe...
Mach dir mal keinen Kopf, "zu basic" gibt es nicht.
Bernd_123 hat Folgendes geschrieben:
Die beiden separaten z-Werte sollen mit den jeweiligen x - und y- Werten zwischengespeichert werden und nach ablauf der Schleifen, als mesh oder surf angezeigt werden.
Ich bin nicht sicher, ob ich das verstehe. Möchtest du Zahlentripel erstellen, so dass du (x1, y1, z1), (x2, y2, z2) usw erhätlst?
an. Dies erzeugt dir eine x-y-Matrix. Dann musst du zu den x-y-Paaren nur noch dein z berechnen und kannst das ganze dann plotten.
Beste Grüße,
Seban
Bernd_123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.03.2013, 17:45
Titel:
Hallo Seban,
danke für deine Antwort!
Wenn ich all die anderen Beiträge so lese, hab ich schon die Befürchtung das meine Frage zu trivial ist... deshalb schon mal besten Dank für die Rückmeldung.
Ja du hasts genau richtig verstanden, mit dem Zahlentripel.
Wie schon im Eingangspost beschrieben, wäre das Ziel, die beiden enstehenden Gebilde abh. von z1 und z2 mittels meshgrid und mesh bzw. surf darzustellen.
Das mit dem meshgrid hab ich schon versucht, aber ich bekomm das mit den zwei darin enthaltenen Schleifen (für x und y )nicht gebacken.
Deshalb war mein Gedanke ich verpack die jeweiligen Ergebnisse mit den dazugehörigen x und y Werten in ne Matrix und lass sie danach durch das meshgrid irgendwie zeichen...
Aus meiner Matlab-How-To-Sammlung zu meshgrid (vielleicht macht es das etwas verständlicher):
Zitat:
Funktion, mit der man Felder automatisch belegen kann. meshgrid erzeugt X- und Y Matrizen für dreidimensionale Plots:
[X, Y] = meshgrid(anfX:diffX:endX, anfY:diffY:endY);
[X, Y] = meshgrid(x); entspricht [X, Y] = meshgrid(x, x);
Die Vektoren x= anfX:diffX:endX und y = anfY:diffY:endY definieren die Intervalle auf der x- bzw. y Achse, über die eine Funktion z=f(x, y) ausgewertet werden soll.
Die beiden Matrizen X und Y bauen ein Netz über der x-y-Ebene auf.
meshgrid belegt die Zeilen des X-Feldes mit Kopien des Vektors x und die Spalten des Y-Feldes mit Kopien des Vektors y:
Das Z hat durch die Berechnung mit X und Y die gleiche Größe wie eben X und Y.
Deine Zahlentripel lauten dann ( x(1, 1), y(1, 1), z(1, 1) ), ( x(1, 2), y(1, 2), z(1, 2) ) usw.
Wie willst du denn z1 und z2 bestimmen?
Grüße
Bernd_123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.03.2013, 18:32
Titel:
Danke für die Info!
Die z1 und z2 - Werte werden durch mehrere Wurzelberechnungen bestimmt und durch if - Bedingungen werden dann die gültigen z1 und z2 Werte geplottet und die "ungültigen" nicht.
Durch das meshgrid bekomm ich aber nur alle z1 und z2 Werte dargestellt, also mit den "ungültigen" zusammen und das will ich gern vermeiden. Oder bin ich ganz auf der falschen Fährte in meiner Denkweise?
Ach so!!! mit NaN einfach ungültig machen und dann plottert er auch nicht.
Siehst du, so banal, aber ich bin nichtmal auf diese Idee gekommen.
Die Bedingungen sind eine Reihe von if-Bedingung wobei eine Eingangszahl verschiedene Vergleiche zu durchlaufen hat. Ich hab diese Berechnungen momentan leider nur in Excel und werde sie jetzt dann mal ins Matlab integrieren.
Danke, vielmals!
Ich hab jetzt auch endlich geschafft die gültigen Werte in eine Matrix zu verpacken, (also erste Spalte die x Werte, zweite die y und dritte die z Werte)weißt du vllt auch einen Weg wie ich daraus ein mesh,surf erzeugen kann, dann waren die letzten ca. 10h nicht ganz für die Katz...
Code:
z11= zeros(30,3,30);
% Schleife x
%Schleife y
%Berechnungen
Ich hab jetzt auch endlich geschafft die gültigen Werte in eine Matrix zu verpacken, (also erste Spalte die x Werte, zweite die y und dritte die z Werte)weißt du vllt auch einen Weg wie ich daraus ein mesh,surf erzeugen kann, dann waren die letzten ca. 10h nicht ganz für die Katz...
Statt wie in obigem Bsp X, Y, Z an mesh oder surf zu übergeben, musst du jetzt die entsprechenden Werte deiner Matrix übergeben. Bsp M ist deine Matrix, Spalte 1 = X, Spalte2 = Y, Spalte 3 = Z
Das versteh ich nicht. Was soll hier genau geschehen?
Bernd_123 hat Folgendes geschrieben:
nur wie bekomme ich das nun in ein meshgrid eingebaut?
Wenn du deine x und y bereits erzeugt hast und es funktioniert, benötigst du kein meshgrid. Es bleibt aber die Frage, macht es vom Code her Sinn kein meshgrid zu verwenden? Die Funktion ist eben für diese Aufgabe prädistiniert.
Grüße
Bernd_123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.03.2013, 20:00
Titel:
Hallo Seban, danke das du mir hilfst.
Code:
data= zeros(30,3,30);
for x = 1 : 20% Schleife x for y = 1 : 20 %Schleife y
%Berechnungen
eingebe, öffnet er zwar ein 3D Koordinatensystem, aber komplett leer.
Wenn ich das gleiche mit surf versuche, bringt er mir diese Fehlermeldung:
Warning: Single isoline (scan) is not enough for a pm3d plot.
Weißt du was hier der Fehler ist?
Grundsätzlich hast du sicherlich recht mit dem meshgrid, aber als ich anfing, kannte ich noch keine Funktionen außer for und while Schleifen. Ich taste mich mittels try&error-Verfahren und reichlich Internetrecherche vorsichtig voran. Beim nächsten mal werde ich es gleich von Anfang an mit meshgrid machen. Nochmals danke für den Hinweis.
In deinem Code kam es in der mesh-Zeile zu einer Fehlermeldung.
Zitat:
CData must be an M-by-N matrix or M-by-N-by-3 array
...
Du hattest ein Mx3xN erstellt. Die gleiche Fehlermeldung habe ich auch bei surf erhalten
Zudem hast du data in einer anderen Größe vorbelegt, als letztlich gebraucht wurde. Dadurch wurde zusätzlich ein Haufen Nullen geplottet.
Bernd_123 hat Folgendes geschrieben:
Grundsätzlich hast du sicherlich recht mit dem meshgrid, aber als ich anfing, kannte ich noch keine Funktionen außer for und while Schleifen. Ich taste mich mittels try&error-Verfahren und reichlich Internetrecherche vorsichtig voran. Beim nächsten mal werde ich es gleich von Anfang an mit meshgrid machen. Nochmals danke für den Hinweis.
Klar, das ist ja legitim. Aber es spricht auf der anderen Seite auch nichts dagegen bereits das aktuelle Programm effizienter zu programmieren.
Die beiden for-Schleifen erzeugen in data(:,:,1:2) exakt das gleiche wie der Befehl
Wobei XX = data(:,:,1) und YY = data(:,:,2). Ich weiß nicht, wie deine z berechnet werden, aber ich nehme an, dass dies auch elementweise in einer Matrix geschehen könnte (korrigiere mich, falls ich falsch liege). Und dann wird aus einem 400-fachen Schleifendurchlauf, in dem jedes mal eine Berechnung durchgeführt ein Zweizeiler, in dem die Berechnung 1 mal auf das gesamte Array erfolgt.
(der obere Code ist ca um den Faktor 10 schneller)
Welche Lösung du wählst, ist im Endeffekt egal, wenn das Skript ein mal läuft, dann läuft's und bei nicht zu großen Arrays stört auch die Geschwindigkeit nicht. Aber ich finde den ersten Code deutlich schöner
eine Fläche zwischen der jeweiligen x,y und z- Koordinate dar.
Ich bräuchte allerdings eine Fläche, die die jeweiligen z- Koordinaten miteinander verbindet.
Gibts da irgendwelche "befehle" die mir das dann so darstellen?
Ich find irgendwie nix...
Gruss Bernd
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.