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

Werte einer [m,n]-Matrix als Bild wiedergeben

 

Digusil
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.02.2009, 19:21     Titel: Werte einer [m,n]-Matrix als Bild wiedergeben
  Antworten mit Zitat      
Hallo erstmal,

ich habe ein etwas kniffliges Problem, auf dass Ihr hoffentlich eine Antwort wisst. Ich habe eine [m,n]-Martix, deren Werte nicht linear, sondern in x- und y-Richtung durch Vektoren festgelegt werden sollen. Die Werte der Matrix sollen als "Pixel" mit zugehöriger Farbe dargestellt werden, um den Wert in der Grafik erkennen zu können.

Hintergrund der ganzen Aktion ist, dass ich für eine Diplomarbeit STFT- und CWT-Analysen durchführe und die Ergebnisse mit v.a. logarithmischen Ordinaten darstellen möchte.

Könnte mir bitte jemand weiterhelfen.

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen


HFS45
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 19.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2009, 14:22     Titel:
  Antworten mit Zitat      
Hallo!

Könntest du mal einen Codeausschnitt (das was halt für die Problemlösung interessant ist) posten. Kann mir nämlich irgendwie nicht vorstellen wo genau das Problem liegt.

Bezüglich deiner Matrix, schaut die so aus? Wenn ja, wie schaut diese in Matlab genua aus. Wie sprichst du diese an?


Lg HFS45
Private Nachricht senden Benutzer-Profile anzeigen
 
Digusil
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2009, 14:45     Titel:
  Antworten mit Zitat      
Ich bin mir nicht ganz sicher, ob die Funktion CWT bekannt ist, daher kleine Einweisung:
y ist ein Vektor, der ein zu analysierentes Signal darstellt
scales ist ein Vektor, der steuert, in welchem Frequenzbreich und mit welcher Auflösug untersucht wird
wname ist das zu benutzende Wavelet

Code:
coefs=cwt(y,scales,wname);   %Ermittelung der Waveletkoeffizienten
F=scal2frq(scales,wname)*fs; %Umrechnen der scales in Frequenzen


Der Zeitvektor ist durch die Anzahl der Elemente in y gegeben und kann durch die Abtastrate leicht generiert werden.

Das Problem ist nun, dass die Matrix coefs die darzustellenden Koeffizienten enthält. Die Werte coefs( m , : ) sind ein scale bzw. eine Frequenz, die Werte coefs( : , n ) sind ein Zeitpunkt. Die Werte coefs( : , n ) sind einfach, da sie linear über den Zeitbereich verteilt sind. Die Werte coefs( m , : ) sind das Problem, sie sind reziprog verteilt, und sollen in der Grafik logarithmisch dargestellt werden.

Mit der Funktion imagesc komme ich nicht weit, da ich weder die Werte beliebig anordnen kann auf der Ordinate, noch einen logarithmische Aufteilung realisieren kann. Bisher löse ich das Problem, indem ich contourf benutze, jedoch funktioniert dies nur bendingt, und für viele Signale nicht anwendbar.
Private Nachricht senden Benutzer-Profile anzeigen
 
Digusil
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2009, 12:40     Titel:
  Antworten mit Zitat      
Ganz großes Kino!

Ich bin geradezu überweltigt, wie einem hier geholfen wird. Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2009, 14:02     Titel:
  Antworten mit Zitat      
Wie sieht denn eine solche Matrix beispielhaft aus?
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 28.02.2009, 15:04     Titel:
  Antworten mit Zitat      
Hi,

tut mir Leid, aber ich glaube das Problem ist, wir können kaum nachvollziehen was du machen möchtest. Oben steht was von ner Matrix, von der keiner weiß wie Sie aussieht. Dann erwähnst du kurz eine STFT und danach erklärst du CWT und das die Darstellung logarithmisch sein soll. D.h. ich kann auch nur ins blaue hineinraten:

Ich stelle meine STFT immer so dar:

Code:
pcolor(Zeit, Frequenz, Amplitude);


geht natürlich auch mit log(Amplitude).
Dann setze ich meist

Code:


Damit nicht interpoliert wird. Für die CWT sollte das so ähnlich funktionieren, da du die Frames ja dort speichern kannst. Bei der STFT ist es natürlich einfacher weil die dort fest sind.

Hilft dir das?

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Digusil
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2009, 16:50     Titel:
  Antworten mit Zitat      
Ich hab mir die Mühe gemacht, und ein kleine Funktion geschrieben, die mir nun weiter hilft. Ich werde pcolor mal ausprobieren, war mir bisher nicht bekannt, klingt aber nach dem was ich suche. Vieleicht hilft es euch, wenn ich euch mal die Funktion zeige, die ich nun verwende.

Code:
%imagescale.m       Version: 1.1        2009-02-27
%Thomas Pircher
function [output]=imagescale(t,f,coeff,window,scaleend,cmap,cscala)


if nargin<5
    scaleend=[0 0 0 0];
end

if nargin<6
    cmap='jet';
end

if nargin<7
    cscala=':k';
end

[m,n]=size(f);

if m==1
    f=f';
end

[m,n]=size(f);

o=1;
p=m;

if scaleend(3)==0 && scaleend(4)==0
else
    for i=1:m
        if f(i)<scaleend(3)
        o=o+1;
        end
   
        if f(i)>scaleend(4)
        p=p-1;
        end
    end
end


f_scale=f(o:p);

y=round((window-1)/max(log10(f_scale/min(f_scale)))*log10(f_scale/min(f_scale)))+1;

[m,n]=size(y);

[M,N]=size(t);

if M==1
    t=t';
end

[M,N]=size(t);

O=1;
P=M;

if scaleend(1)==0 && scaleend(2)==0
else
    for i=1:M
        if t(i)<scaleend(1)
        O=O+1;
        end
   
        if t(i)>scaleend(2)
        P=P-1;
        end
    end
end

t_scale=t(O : P);
coeff_scale=coeff(o:p,O : P);

[M,N]=size(t_scale);

if y(1)>y(m)
    for T=1:M
        index=[m m];
        for i=1:window
            while i>=y(index(1)) && index(1)>1
                index(1)=index(1)-1;  
            end
            coeff_map(i,T)=mean(coeff_scale(min(index+[1 0]):max(index+[1 0]),T));
            index(2)=index(1);
        end
    end
else
    for T=1:M
        index=[1 1];
        for i=1:window
            while i>=y(index(1)) && index(1)<m
                index(1)=index(1)+1;  
            end
            coeff_map(i,T)=mean(coeff_scale(min(index-[1 0]):max(index-[1 0]),T));
            index(2)=index(1);
        end
    end
end


pot=floor(log10(max(t_scale)))-1;

step=floor((max(t)-min(t))/5/10^(pot))*10^(pot);

scalax=floor(min(t)/10^(pot))*10^(pot):step:ceil(max(t)/10^(pot))*10^(pot);

[e,f]=size(scalax);

v=1;

for i=1:f
    if scalax(i)<min(t) || scalax(i)>max(t)
    else
        b(v)=scalax(i);
        v=v+1;
    end
end

b_map=round((M-1)/max(t_scale)*b)+1;

scalay=floor(log10(min(f_scale))):ceil(log10(max(f_scale)));

u=1;

for i=scalay
    for n=1:9
        if n*10^(i)<min(f_scale) || n*10^(i)>max(f_scale)
        else
            c(u)=n*10^(i);
            u=u+1;
        end
    end
end

c_map=round((window-1)/max(log10(f_scale/min(f_scale)))*log10(c/min(c)))+1;

[k,l]=size(c_map);
[g,h]=size(b_map);


if nargout==1
    output=c_map;
else
    hold on
    imagesc(coeff_map);
    colormap(cmap);
    colorbar('SouthOutside')
       
    for i=1:l
        plot([1 M],c_map(i)*ones(1,2),cscala);
    end
   
    for i=1:h
        plot(b_map(i)*ones(1,2),[1 window],cscala);
    end
   
    XLim([1 M]);
    YLim([1 window]);
   
    set(gca,'XTick',b_map);
    set(gca,'XTickLabel',b);
   
    set(gca,'YTick',c_map);
    set(gca,'YTickLabel',c);
   
    set(gca,'FontSize',8);
   
    window=get(gcf,'position');
    set(gcf,'position',[1 1 1 1.75].*window)
   
end


edit:

pcolor funktioniert mit den STFT-Daten super, kann aber die CWT-Daten nicht verarbeiten, da diese zu viel an der Zahl sind. Es reicht der Speicher einfach nicht (und mein Rechner hat davon nun eigentlich nicht zuwenig). Meine Funktion ist zwar nicht sehr schnell, kann aber damit arbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 01.03.2009, 17:15     Titel:
  Antworten mit Zitat      
Hi,

ich würde das nicht gerade ne kleine funktion nennen. Würde glaube ich mind. eine Stunde brauchen um zu verstehen was du da machst. Weiß jetzt auch nicht wie ich dir da jetzt gerade noch helfen kann. Probier einfach das pcolor mal aus und sag bescheid obs klappt oder nicht.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Digusil
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2009, 17:48     Titel:
  Antworten mit Zitat      
Nun, pcolor ist schon genau das, was ich gesucht habe. Von daher vielen Dank, aber das Problem ist, dass dieser Algorithmus in Verbindung mit der Datenmenge, die bei der CWT entsteht, zuviel Arbeitsspeicher benötigt (4Gbyte real und 4Gbyte virtuell reichen anscheinend nicht mal ansatzweise). Der Algorithmus von mir braucht für die Datenmenge ca. 7 bis 8 min. Das ist nun nicht schnell, aber er funktioniert, von daher werde ich diesen wohl weiter ausbauen.

Bei einer Messung der Bereuchnungsdauer mithilfe der cputime-Funktion habe ich bei den STFT-Daten ermittelt, dass pcolor ca. 1,8s und meine imagesale-Funktion 2,2s benötigt um die Grafik zu erstellen. Von daher eigentlich noch ganz gut.

Falls jemand mal auf ähnliche Probleme mit der Darstellung von Matrix-Daten stößt und pcolor nicht verwenden kann, darf es gerne mal mit imagescale versuchen.
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.