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

for-Schleifen vermeiden!!!

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2011, 20:25     Titel:
  Antworten mit Zitat      
Hallo,

es wird ein Denkfehler gewesen sein. Nach mehrmaligem Prüfen und vielem Nachdenken denke ich, dass die Berechnungen und damit die Werte korrekt sind.

Mein Idee, wieso die Werte unterschiedlich sind:
Bei Variante 2 und auch bei Variante 1 (reine Berechnung) wird die Schlangenlänge mit nicht ganzzahligen Werten berechnet (also mit den genauen Werten). Deshalb liegen beide Ergebnisse auch sehr nah beieinander.

Werte aus Variante 3 schlagen nich völlig aus der Reihe, scheine logisch korrekt, weichen jedoch etwas von 1 und 2 ab. Bei Variante 3 wird ja der Mittelwert aus der gerade aktuellen Schlangenlänge beim entsprechend simulierten Kunden bestimmt. Nun ist die aktuelle Schlangenlänge ja immer ganzzahlig. Wenn keine Schlange da ist also 0 und je nach Länge dann 1,2,3,4..........

Eine Simulation über 1.000.000 Kunden brachte auch keine Annäherung der Werte, deswegen vermute ich, dass es einfach aus dem Umstand der Ganzzahligkeit resultiert. Klingt das logisch bzw. kann man überhaupt verstehen, was ich meine Rolling Eyes ?

Viele Grüße


Lars_k_H

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2012, 13:44     Titel: Ineffizienter Code
  Antworten mit Zitat      
Hi,
bin zufällig über dieses Forum gestolpert, als ich auf die Auswerung meiner Funktion wartete.

Ich warte im schnitt so 5 Std bei einer echt guten Hardwareumgebung.

also ich lade eine 62 MB Datei mit Messwerten und lasse dann folgenden Code ablaufen:

Code:

%##################################################################
   %## Laden der Messdaten                                ##
   %##                                                       ##
   %##################################################################
   
   data = load('C1stanz-vor1.dat');
   %data = load('C1_spannung.dat');
   
   mittel = 100;
   
   data_x = data(:,1);
   data_y = data(:,2);
   
   %##################################################################
   %## Bearbeiten der Messdaten                             ##
   %## Verschieben, Mittelung, Filtern                         ##
   %##################################################################
   
   versch = data_x(1)*(-1);

   
    delta_t = data_x(2)-data_x(1);
    fa = 1/delta_t;                             %Abtastfrequenz
    fa
   
   figure(1);
   plot(data_x,data_y,'r');
   title('Unbearbeitete Messdaten');
   
   for i=1:length(data)
      data_x(i) = data_x(i)+versch;
   end

   %#####################################Test###########################
   
   
   N   = length(data_x);               % # Laenge der Vektoren
   f   = 0:1/N*fa:(N-1)/N*fa;         % # erzeugen des Frequenzvektors
   
   data_X = fft(data_x);
   data_Y = fft(data_y);
   
   for i=1:length(data_Y)
      dB_data_Y(i) = 20*log(abs(data_Y(i))/1e-6);
    end
   
   figure(5);
   semilogx(f,dB_data_Y,'b');
   title('Absolutes Frequenzspektrum des Zeitsignals (ohne Filter)');
   
   
   %####################################################################
   
   
   figure(2);
   plot(data_x,data_y,'k');
   title('Verschiebung auf "0"-Punkt');
     
   for i=1:(length(data)-mittel)
         var = 0;
         ende = i+mittel;
         for a=i:ende
            var = var+data_y(a);
         end
      data_y(i)=var/mittel;
   end
   
   figure(3);
   plot(data_x,data_y,'b');
   title('Mittelung einiger Signalwerte');
   
   
   %###################################################################
   %## Berechnen des Frequenzspektrums des Zeitsignals              ##
   %##                                                  ##
   %###################################################################
   
   
   N   = length(data_x);               % # Laenge der Vektoren
   f   = 0:1/N*fa:(N-1)/N*fa;         % # erzeugen des Frequenzvektors
   
   data_X = fft(data_x);
   data_Y = fft(data_y);
   
   for i=1:length(data_Y)
      dB_data_Y(i) = 20*log(abs(data_Y(i))/1e-6);
   end
   
   figure(4);
   semilogx(f,dB_data_Y,'b');
   title('Absolutes Frequenzspektrum des Zeitsignals');
 

Könnt ihr mir helfen??
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 23.02.2012, 13:57     Titel: Regestriert
  Antworten mit Zitat      
Hallo Com.

hab mich auch gleich regestriert, da hier so einige interessante Themen sind Smile
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.02.2012, 14:01     Titel:
  Antworten mit Zitat      
Man kann hier vermutlich fast alle for Schleifen vermeiden...

Code:

for i=1:length(data)
      data_x(i) = data_x(i)+versch;
end
% äquivalent
data_x = data_x + versch;

for i=1:length(data_Y)
       dB_data_Y(i) = 20*log(abs(data_Y(i))/1e-6);
end
% äquivalent
dB_data_Y = 20*log(abs(data_Y)/1e-6);
% allerdings sollte man hier immer ein kleine Konstante (eps) aufaddieren um log(0) zu vermeiden

% var ist ein Schlüsselname/ Funktion für varianz und sollte daher nicht benutzt werden
for a=i:ende
     var = var+data_y(a);
end
% äquivalent
sum_data = sum(data_y(:)); % wenn nötig explizit den Bereich von data_y festlegen
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 23.02.2012, 14:06     Titel:
  Antworten mit Zitat      
Hi,

danke für die sehr schnelle Antwort!
Werde den Kode direkt umschreiben und mal schauen.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.02.2012, 14:09     Titel:
  Antworten mit Zitat      
Wenn man schon Schleifen benutzt und dort einem Vektor/Matrix Werte zuweist, sollte diese/r auch vorher schon allociert sein...das spart ebenfalls Zeit.

Code:

%z.B.
c = zeros(10,1); % Speicherplatz reservieren
for i=1:length(c)
 c(i) = ...
end;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 23.02.2012, 14:18     Titel:
  Antworten mit Zitat      
Ok,
allocieren kenn ich noch von der C-Programmierung.
Hab gedacht MATLAB macht das auto. ??
Ich müsste ja dann Speicher in der Größenordnung meiner Matrix sprich 63 MB allocieren. Kommt das nicht aufs selbe ??
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.02.2012, 14:24     Titel:
  Antworten mit Zitat      
Sicherlich kann das matlab auch von allein...aber wenn man den Platz vorher selber festlegt, geht es eben schneller, da dann nicht immer wieder neuer Speicherplatz reserviert werden muss. Hier finden sonst immer wieder Copy und paste Vorgänge statt die nun mal Zeit brauchen...vor allem bei 63 MB.

Wenn du einen Ergebnisvektor mit 63 MB brauchst, musst du den auch reservieren. Allerdings wird die Ausführungszeit wohl auch auf Grund der Masse deiner Daten so hoch sein. Evtl. musst du die Daten sonst Segmentieren...

Edit:

Code:

for i=1:(length(data)-mittel)
          var = 0;
          ende = i+mittel;
          for a=i:ende
             var = var+data_y(a);
          end
       data_y(i)=var/mittel;
    end
 


Wenn ich das hier richtig verstehe, ist das ein gleitender Mittelwert über 100?! Schau dir mal den Befehl
Code:
an Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 23.02.2012, 14:59     Titel:
  Antworten mit Zitat      
Oh ja ..
Code:
sieht super aucs Smile

Danke noch mal!!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.02.2012, 15:14     Titel:
  Antworten mit Zitat      
Hallo

also wenn das der gleitende Mittelwert ist, dann kann man gleich FILTER statt Schleifen nutzen

Code:

data_y = [1:1000]'
mittel   = 100;
data_y = filter(ones(1,mittel)/mittel,1,data_y)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 23.02.2012, 16:11     Titel:
  Antworten mit Zitat      
Hey denny,

super Idee. habe ich gleich umgesetzt und läuft natürlich besser Smile

Also noch mal allgemein muss ich ein riesen Dankeschön hier abgeben ihr helft mir bei meiner BA echt weiter!!

Ich möchte auch jetzt nochmal den optimierten Kode hier preisgeben (auch mit der Befürchtung Spam zu erzeugen):

Code:

   %##################################################################
   %## Laden der Messdaten                                ##
   %##                                                       ##
   %##################################################################
   
   %data = load('C1stanz-vor1.dat');
    data = load ('C2stanz-nach.dat');
   %data = load('C1_spannung.dat');
   
   mittel = 100;
   
   data_x = data(:,1);
   data_y = data(:,2);
   
   %##################################################################
   %## Bearbeiten der Messdaten                             ##
   %## Verschieben, Mittelung, Filtern                         ##
   %##################################################################
   
   versch = data_x(1)*(-1);

   
    delta_t = data_x(2)-data_x(1);
    fa = 1/delta_t;                             %Abtastfrequenz
    fa
   
   figure(1);
   plot(data_x,data_y,'r');
   title('Unbearbeitete Messdaten');
   
   
      data_x = data_x+versch;
   


   
   
   figure(2);
   plot(data_x,data_y,'k');
   title('Verschiebung auf "0"-Punkt');
   %#####################################Test###########################
   
   
   N   = length(data_x);               % # Laenge der Vektoren
   f   = 0:1/N*fa:(N-1)/N*fa;         % # erzeugen des Frequenzvektors
   
   data_X = fft(data_x);
   data_Y = fft(data_y);
   
   
      dB_data_Y = 20*log(abs(data_Y)/1e-6);
 
   
   figure(5);
   semilogx(f,dB_data_Y,'b');
   title('Absolutes Frequenzspektrum des Zeitsignals (ohne Filter)');
   
   
   %####################################################################      
    mittel   = 100;
    data_y_filt = filter(ones(1,mittel)/mittel,1,data_y);
   figure(3);
   plot(data_x,data_y_filt,'b');
   title('Signalwerte gefiltert');
   
   
   %###################################################################
   %## Berechnen des Frequenzspektrums des Zeitsignals              ##
   %##                                                  ##
   %###################################################################
   
   
   N   = length(data_x);               % # Laenge der Vektoren
   f   = 0:1/N*fa:(N-1)/N*fa;         % # erzeugen des Frequenzvektors
   
   data_X = fft(data_x);
   data_Y = fft(data_y);
   

      dB_data_Y = 20*log(abs(data_Y)/1e-6);
   
   
   figure(4);
   semilogx(f,dB_data_Y,'b');
   title('Absolutes Frequenzspektrum des Zeitsignals');
 


Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 12.03.2012, 13:47     Titel: Wieder eine blöde for Schleife
  Antworten mit Zitat      
Hi liebe comu.

da ich letztens hier so gute Hilfe bekommen habe hab ich zur Zeit wieder ein kleines Problem mit meiner Code Effizients Smile

Ich brauche zur Mittelwert Bildung eine For-Schleife kann man die irgendwie umghen??

Code:

clc;
clear all;
close all;

a=(1:12)'
b=1;
anz_mean=3;

index_max=length(a);

for i=1:anz_mean:index_max
   
    m(b) = mean(a(i,1):a(i+(anz_mean-1),1))
    b=b+1;    
end
m'
 


ich weiß ich hab hier auch noch keinen Speicher vorher allociert, dass würde ich noch mit reinnhemne wenn die for Schleife unumgöänglich ist ..

Danke schon mal
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 12.03.2012, 13:52     Titel:
  Antworten mit Zitat      
Code:
da ist auch ein beispiel zur bestimmung des laufenden mittelwerts
Private Nachricht senden Benutzer-Profile anzeigen
 
Lars_k_H
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 23.02.12
Wohnort: Herne
Version: R2018b update 4
     Beitrag Verfasst am: 12.03.2012, 15:08     Titel:
  Antworten mit Zitat      
hi,
in der documation von filetr steht leider nur ein Beispiel für den gleitenden Mittelwert und nicht für den laufenden. In bin mir auch nicht sicher ob der Algorythmus zur Berechnung des laufenden Mittelwert geeignet ist.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 12.03.2012, 15:11     Titel:
  Antworten mit Zitat      
du nimmst dann halt nur jedes 3. element aus dem gleitendem Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  Weiter

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.