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

Herausforderung? :) pcolor und grafikanalyse

 

Andband
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2009, 21:52     Titel: Herausforderung? :) pcolor und grafikanalyse
  Antworten mit Zitat      
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 Very Happy

Tja...leider habe ich ein Problem. Hm..ich versuchs mal modular zu schildern - sonst check ich wahrscheinlich mal wieder gar nichts Smile
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? Smile - ich kann mir Sachen immr sehr schwer vorstellen Sad

wäre super!!
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 11.03.2009, 12:19     Titel: Re: Herausforderung
  Antworten mit Zitat      
Hallo Andband,

ich nehme die Herausforderung an. Smile

Andband hat Folgendes geschrieben:
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.

Code:


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!

Code:


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:
Code:
Z = rand(20);
figure
pcolor(Z);
title('2-dim Matrix erzeugt 2-dim Bild')

x = linspace(0,1,20);
y = x.^2;
figure
pcolor(x,y,Z);
title('Gleiche Farben - andere Achsenaufteilung');

[X,Y] = meshgrid(x,y);
X = X + 1e-2*randn(20);
Y = Y + 1e-2*randn(20);
figure
pcolor(X,Y,Z)
title('Individuelle Gitterkoordinaten')


Alles klar? Smile

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2009, 02:30     Titel:
  Antworten mit Zitat      
wow - cool - danke dir!

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.
Code:

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... Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 12.03.2009, 11:25     Titel:
  Antworten mit Zitat      
Hallo Andband,

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:

Code:


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.

Code:


Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2009, 13:01     Titel:
  Antworten mit Zitat      
jo Smile - 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... Smile
 



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 Smile
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
Code:

[value index]=max(vector(min_index:max_index));
 

wobei hier für mich persönlich noch die Frage auftaucht, was
Code:

[value index]
 

bedeuten soll.

Was haltet ihr von diesem Erklärungsversuch? Bzw. was gibt es dazu ergänzend zu sagen? Very Happy

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 Smile - also das pcolor bild genauso ausschaut Smile

ohje ohje...ich kann mich net gut ausdrücken fürchte ich..

kreis.jpg
 Beschreibung:

Download
 Dateiname:  kreis.jpg
 Dateigröße:  20.57 KB
 Heruntergeladen:  1102 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 12.03.2009, 14:22     Titel:
  Antworten mit Zitat      
Hallo Andband,

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


bzw. etwas hübscher und schneller

Code:
kmax = 5;

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.

Code:
vektor=interp2(X,Y,Z,x_werte,y_werte);


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:

Code:
x_min = min(X(:));
x_max = max(X(:));
y_min = min(Y(:));
y_max = max(Y(:));

x_fein = linspace(x_min,xmax,3000);
y_fein = linspace(y_min,ymax,3000);

[X_Fein,Y_Fein] = meshgrid(x_fein,y_fein);

Z_Fein = interp2(X,Y,Z,X_Fein,Y_Fein);


Für die Interpolation gibt es verschiedene Methoden. Probier einfach aus, was am besten funktioniert:

Code:
% 'nearest', 'linear', 'spline', 'cubic'
Z_Fein = interp2(X,Y,Z,X_Fein,Y_Fein,'spline');


Der maximale Z-Wert auf der Strecke steht für die höchste Intensität der Kreislinie.

Code:
[value index]=max(vektor(min_index:max_index));


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.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2009, 18:01     Titel:
  Antworten mit Zitat      
wow - es macht echt spaß dass hier durchzulesen Very Happy

kmax ist der radius - jetzt check ichs...logisch - da hätt ich nun aber wirklich ma selber draufkommen können Smile - 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 Smile

vielen dank für diese ausführlichste anleitung - du hast es echt saumäßig drauf!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2009, 19:37     Titel:
  Antworten mit Zitat      
krass - es scheint zu funktionieren Smile - 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 Smile

wie auch immer: ich kann mich nur wiederholen - fettes dankeschön

so, jetzt muss ich ma schaun ob das Ergebniss befriedigend ist Smile - ich fürchte fast nicht - aber dafür kann matlab nix Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.03.2009, 18:18     Titel:
  Antworten mit Zitat      
ok - I'm back Very Happy Very Happy

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?

phasenextraktion.zip
 Beschreibung:

Download
 Dateiname:  phasenextraktion.zip
 Dateigröße:  143.6 KB
 Heruntergeladen:  4973 mal
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 - 2024 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.