Verfasst am: 10.03.2009, 21:52
Titel: Herausforderung? :) pcolor und grafikanalyse
Hallo
ich bin wohl auch neu hier und ein blutiger Anfänger mit Matlab und ich hab jetzt hier dieses Forum gefunden..was ja irgendwo net schwer war
Tja...leider habe ich ein Problem. Hm..ich versuchs mal modular zu schildern - sonst check ich wahrscheinlich mal wieder gar nichts
also..genug gelabert, zur Sache:
Frage 1:
Ich hab hier ein m-file das ich irgendwie verstehen muss. Dort werden Daten eingelesen, ffts damit gemacht, Werte zusammengefasst...
Irgendwann ist ein Punkt erreicht bei dem 3 Matrizen x(i,j) , y(i,j) und z (i,j) vorliegen
jetzt kommt der ominöse Befehl "pcolor" ins spiel.
Dort steht nun:
pcolor(x,y,abs(z))
Ich erhalte dann ein 3D Bild bei dem lediglich in der xy-Ebene (also z=0) ein Bild liegt (und zwar eine Art verzogener Kreis/Ellipse mit Mittelpunkt im Ursprung)
Verstanden habe ich denk ich, dass pcolor einen Plot mit selbst einstellbaren Pseudofarben erzeugt. Wenn x,y,z gewöhnliche eindimensionale vektoren sind, dann ist es also ein normaler 3D-Plot nur mit anderen Farben. Ist das ungefähr richtig?
Ich verstehe aber absolut nicht was pcolor mit matrizen als eingabeobjekte macht. Kann mir da einfach nichts drunter vorstellen.
Ich schätz mal viele von euch wissen das natürlich...aber wär es möglich mir das irgendwie zu erklären, so dass ichs kapier? - ich kann mir Sachen immr sehr schwer vorstellen
Wenn x,y,z gewöhnliche eindimensionale vektoren sind, dann ist es also ein normaler 3D-Plot nur mit anderen Farben. Ist das ungefähr richtig?
Nein, ich fürchte nicht. Jedenfalls, wenn Du mit "gewöhnlicher 3D-Plot" so etwas wie plot3 meinst. Ich versuche mal, es ganz unabhängig davon zu erklären.
erzeugt ein flächiges Bild, wie Du es schon beschrieben hast. Dieses ist zweidimensional, weil die z-Komponente durch den Farbwert dargestellt wird. Jedem Wert in z wird eine Farbe zugeordnet, gleicher Wert - gleiche Farbe. Das bedeutet: z muss eine Matrix sein, damit ein flächiges Bild entsteht. Zweidimensionale Matrix -> zweidimensionales Bild.
Was ist jetzt mit x und y? Erstmal: Man braucht sie nicht!
funktioniert auch. Allerdings verändert sich die Beschrifung der Achsen, wenn man x und y angibt: Sie beschreiben die Größenordnung der Ebene, für die die Farbwerte in z gelten. In x und y stehen also die Gitterpunkte, für die man Werte in z hat. Diese Gitterpunkte müssen beispielsweise auch nicht äquidistant sein, sie können beliebige Abstände haben und müssen nur monoton steigend sein. Normalerweise hat man rechtwinklige Gitter. Jede Zeile in z hat dieselben x-Koordinaten, jede Spalte dieselben y-Koordinaten. Daher kann man die Koordinaten in Vektoren x und y angeben. Es kann aber sogar jeder Gitterpunkt einen individuellen Ort haben, gegeben durch je eine x- und eine y-Koordinate. Diese Koordinaten kann man dann in Matrizen x und y angeben. Für jeden Eintrag in der Matrix z gibt es dann korrespondierende Koordinaten an denselben Stellen in x und y. Diese müssen aber noch ungefähr ein Raster bilden, das heißt, jede Zeile und jede Spalte in x und y muss monoton steigend sein.
Hier mal ein lauffähiges Beispiel mit zufälligen Werten:
Ich fass kurz zusammen:
Pcolor = kein 3D-Plot sondern nur ein 2D Bild - die Höhe im entsprechenden 3D Plot wird hier als verschiedene Farbwerte dargestellt.
nimmt dann wahrscheinlich als Koordinaten für den jeweiligen Farbwert dessen Zeilen- bzw. Spaltennummer - oder ?
Bei zusätzlicher Angabe von X,Y (Vektoren) werden explizite Koordinaten für jeden einzelnen Farbpunkt vorgegeben. Das dabei entstehende Gitter ist rechtwinklig.
Wenn man kein rechtwinkliges Gitter möchte, muss man X,Y als Matrix vorgeben.
In dieser Matrix X stehen dann alle X-Koordinaten von den Gitterpunkten, in Y stehen alle Y-Koordinaten.
Und die Formulierung "Farbpunkt" von mir ist wohl etwas unglücklich. Farbe ist nicht an irgendwelchen Punkten, sondern es wird anscheinend zwischen den zugehörigen Gitterlinien aufgefüllt...
Frag sich dann nur wie Matlab das dann macht...
Nehmen wir an wir haben ein 4x4 Gitter - das beinhaltet aber nur 9 Flächen. Also kann nicht jeder Farbwert aus einem Z mit Dimension 4x4 benutzt werden.
Wenn X und Y wie im Beispiel die Dimension 20x20 haben, dann wird in Z doch nur 19x19 benutzt oder? Wenn ich allerdings die Dimension von Z auf nur 19x19 ändere motzt Matlab und sagt, die dimensionen müssen übereinstimmen.
Weißt du was ich meine?
die Beispiele sind übrigens echt toll...vor allem des letzte ist irgendwo echt beeindruckend. So wenig Code und so krass...
danke für das Lob, da hilft man doch gern! Deine Zusammenfassung ist sehr gelungen - genau so ist es.
Auch Deine Beobachtung zu der Anzahl der Zellen ist richtig, darüber habe ich mich anfangs auch sehr gewundert, nachdem ich es bemerkt hatte. Es ist bei pcolor einfach so, dass eine Zeile und eine Spalte komplett verschwinden. Am besten sieht man das bei einer 2x2-Matrix:
Dargestellt wird nur das Element, dass die 1 enthält, also das linke obere in der Matrix, das linke untere in der Grafik.
Wenn das stört, kann man statt pcolor die funktion image benutzen. Dabei muss man aber unter Umständen die Farbverteilung anpassen, was bei pcolor auch automatisch ganz gut klappt.
Außerdem ist bei image das linke obere Element der Matrix auch im Bild links oben.
jo - du hast wieder recht, es wird offensichtlich immer die letzte Zeile und die Letzte Spalte gelöscht.
Ist ja auch im Endeffekt auch egal :] - nur interessant zu wissen.
Ok, ich werd mal den zweiten und wahrscheinlich deutlich krasseren Teil des Problems beschreiben. Ich hoff ich kanns erklären.
Ich habe jetzt also besagte Matrizen X,Y,Z und mein Bild, dass wie gesagt wie eine Art Kreis ausschaut. Dabei ist die Kreislinie unterschiedlich stark gefärbt, weil es ja verschiedene Z-Werte sind. Das schaut ungefähr so aus wie in der Dateianlage.
Grob gesprochen ist das Ziel nun, für jeden Winkel im ersten Quadrant die maximale Höhe der Kreislinie zu bekommen, welche sich natürlich von Winkel zu Winkel ändert, da die Z Komponente nicht gleich ist.
Die Vorgehensweise bisher schaut so aus:
(Ich hab mal meine Interpretation dazu als Comment hingeschrieben)
Code:
for ii=0:90% jeden Winkel durchlaufen
nn=1;
for jj=0:0.0001:1% Linie rastern
x_werte(nn)=kmax*jj*cos(pi*ii/180); % Koordinaten ermitteln die zu der jeweiligen Linie unter dem Winkel ii gehören
y_werte(nn)=kmax*jj*sin(pi*ii/180); % kmax ist wohl ein Skalierungsfaktor
nn=nn+1;
end
vektor=interp2(X,Y,Z,x_werte,y_werte); % tja...
in "vektor" stehen dann meiner Meinung nach die Werte von Z, die auf dieser Linie liegen
Da die Dimension von X,Y,Z nicht zu der von x_werte,y_werte passen, muss dazu wohl irgendwie interpoliert werden. Das macht anscheinend die Matlab funktion interp2
Wahrscheinlich wird dabei einfach das Gebilde aus X,Y,Z so interpoliert, dass genau an den Stellen von x_werte,y_werte ein Z wert besteht
Aus diesem Vektor kann man jetzt das Maximum ermitteln
Was haltet ihr von diesem Erklärungsversuch? Bzw. was gibt es dazu ergänzend zu sagen?
Was bei dem ganzen rauskommt ist aber irgendwie noch unschön - es gibt zu krasse Sprünge in der Kurve wenn ich die Maximal-Werte über die Winkel auftrage. Deshalb sollen die Matrizen X,Y,Z mit den Messdaten welche wohl recht grob (300x300 für ganzen Kreis) sind, verfeinert werden. Gibt es dazu eine Interpolations funktion die mir daraus einfach mal 3000x3000 macht oder so? Und zwar so, dass am ende natürlich noch die Z Werte zu den X,Y Matrizen passen - also das pcolor bild genauso ausschaut
ohje ohje...ich kann mich net gut ausdrücken fürchte ich..
das stimmt alles im Großen und Ganzen. Um die Schleife besser zu verstehen, habe ich mir das mal grafisch umgesetzt, was da passiert:
Code:
kmax = 5; % kmax ist ein Radius
x_werte = zeros(10001,1); % initialisieren
y_werte = zeros(10001,1);
for ii=0:5:90% Winkel in 5°-Schritten durchlaufen
nn=1;
for jj=0:0.0001:1% Linie rastern
x_werte(nn)=kmax*jj*cos(pi*ii/180);
y_werte(nn)=kmax*jj*sin(pi*ii/180);
nn=nn+1;
end figure plot(x_werte,y_werte) axis equal
end
for ii=0:5:90% Winkel in 5°-Schritten durchlaufen
nn=1;
x_werte=kmax*(0:0.0001:1)*cos(pi*ii/180);
y_werte=kmax*(0:0.0001:1)*sin(pi*ii/180);
figure plot(x_werte,y_werte) axis equal
end
In Wirklichkeit werden die Strecken natürlich für jeden Winkel erzeugt. Dann werden die Werte aus der Z-Matrix auf diese Strecken interpoliert, wie Du es beschrieben hast. Eben mit interp2. Jetzt wird auch klar, wieso Du vorher schon Matrizen X und Y hast, obwohl für pcolor auch Vektoren möglich waren: Für interp2 braucht man Matrizen der Größe von Z.
Du hast ein Gitter in X und Y und Werte auf diesem Gitter in Z. interp2 ermittelt (für 2-dimensionale Gebilde) nun die z-Werte, die bei (x_werte, y_werte) vorliegen "würden". Dies ist auch der Schlüssel für die von Dir geplante Interpolation: Anstelle von x_werte und y-werte musst Du Matrizen einsetzen, die die Fläche in 3000x3000 Pixel unterteilen. Das geht beispielsweise so:
ermittelt jetzt nicht nur den maximalen Wert (value), sondern auch die Position (index), wo der maximale Wert im Vektor vector auftritt. Mit dem Index wird dann gewiss noch weitergerechnet.
Deine Beschreibungen sind für mich übringens gut verständlich.
kmax ist der radius - jetzt check ichs...logisch - da hätt ich nun aber wirklich ma selber draufkommen können - dieser radius sollte natürlich für jeden winkel größer sein als der "kreis" selbst im im bild :] - sonst überprüft man den relevanten bereich ja gar nicht - aber bevor ich jetzt hier wieder rumlaber geh ich erstmal ausprobieren
vielen dank für diese ausführlichste anleitung - du hast es echt saumäßig drauf!!
krass - es scheint zu funktionieren - nur komisch, wenn ich es mit einem 3000x3000 Netz versuche, motzt er wegen Speicher...bei 1000x1000 geht es dagegen.
Das wundert mich ein bisschen:
3000x3000x8 Bytes sind doch nur 72 MB - bei 3 GB speicher dürfte es doch eigentlich noch keine Probleme geben, es sei denn die Interpolationsroutine ist sehr speicherhungrig.
die andere Frage die sich mir noch stellt ist das mit dem meshgrid-befehl: damit mache ich jetzt ja wieder ein äquidistantes Netz oder? Da dieses aber viel feiner ist als das beliebige Netz zuvor, wird da wohl kein Fehler gemacht nehme ich an
wie auch immer: ich kann mich nur wiederholen - fettes dankeschön
so, jetzt muss ich ma schaun ob das Ergebniss befriedigend ist - ich fürchte fast nicht - aber dafür kann matlab nix
also, Obiges klappt wie bereits erwähnt vom "Matlabischen" her super - aber es liefert leider keine viel besseren Ergebnisse.
Der oben beigefügte Kreis stammt irgendwie aus einer FFT von den Messdaten. Dabei ist der interessierende Bereich allerdings sehr schlecht aufgelöst. Man hat dort nämlich nur sehr wenige Punkte.
Der zweite Ansatz packt deshalb die Messdaten selbst an. Ich habe solche mal für eine Messung angehängt. Man sieht einmal die Amplitudenwerte dargestellt und einmal die Werte für die Phase (Anlage: m-File starten).
"Ziel des Spiels" wäre es nun, für alle Winkel im ersten Quadranten den Verlauf der Phasen zu extrahieren. Ich hab es mal für 0 Grad in dem m-file angedeutet, was ich meine.
Dabei gibt es ein Problem. Um die Winkel zwischen 0 und 90 Grad "anzuschauen" brauche ich ja irgendwelche Sinus und Cosinus Funktionen um auf die richtigen Phasenwerte aus der Matrix herauszupicken. Sehe ich das richtig? Und zusätzlich bräuchte ich den Mittelpunkt von all diesen Wellen, den man mit bloßem Auge im pcolor-Phasenplot recht gut erkennt - nur wie krieg ich Matlab dazu, diesen selbst herauszufinden? Meine erste Überlegung war diesen Mittelpunkt dort hinzulegen, wo die Amplitudendarstellung ihr Maximum hat, aber das haut wenn man die beiden Bilder vergleicht wohl nicht hin. Hm.
Wie würde man hier vorgehen? Bzw. hat man da überhaupt eine Chance?
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.