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

Struct verschnellern

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 08:54     Titel: Struct verschnellern
  Antworten mit Zitat      
Hi

Ich habe folgendes Problem.

In meinem Programm hab ich folgende Codzeile

Code:
for t=Number
            parts(t,:)=struct('state',value,'iterations',iter,'place',t);
        end


Da kommt die bekannte fehlermeldung, seems to change size on every loop, consider prelocating for speed.
wenn ich jedoch den speicher vorgebe wie in der Matlabhilfe beschrieben mit

Code:
parts(200,1)=struct('state',[],'iterations',[],'place',[]);


wird das ganze noch langsamer. Gibt es eine andere Möglichkeit?
Vektorisieren ist nicht möglich da nicht bekannt ist wie lange der Struct genau wird und die obere for Schlaufe nochmal in eine for Schlaufe gepackt ist. (200 ist einfach eine obere grenze, grösser sollte es nicht werden)


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.04.2012, 09:36     Titel:
  Antworten mit Zitat      
Hallo
so musst du machen:
Code:

parts  = struct('state',cell(200,1),'iterations',[],'place',[]);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 09:48     Titel:
  Antworten mit Zitat      
Hmm nein es werden 200 verschiedene Parts. value ist ein vektor der meistens grösser ist als 200.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.04.2012, 09:55     Titel:
  Antworten mit Zitat      
Zitat:
Hmm nein es werden 200 verschiedene Parts. value ist ein vektor der meistens grösser ist als 200.

Also verstehe ich dich nicht, weiß heiß das?

Du hast doch gemeint es werden nicht mehr als 200?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 09:58     Titel:
  Antworten mit Zitat      
Also es gibt 200 verschiedene Teile
Parts ist ein Struct mit 200 einträgen, in jedem dieser Einträge sind 'state', 'iterations', 'place' gespeichert.
Wovon state und iterations vektoren sind. Wenn ich das richtig verstehe würde dein vorschlag mir nur in part(1,1).state 200 einträge vorspeichern oder?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.04.2012, 10:04     Titel:
  Antworten mit Zitat      
Nein, das ist falsch

Es wird eine Struct part erzeugt, mit genau 200 Einträgen,
wobei alle Felder leer sind.
Probiere es doch in Command Window aus.
Außerdem wenn du weiß dass es maximal 200 Einträge sind, sollst du die Initialisierung der Struktur aus beiden FOR-Schleifen nach vorne auslagern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 10:09     Titel:
  Antworten mit Zitat      
Oh stimmt. Sorry^^
Ja das die Initialisierung aus den FOR-Schlaufen muss ist klar.
Aber schneller wirds auch so trotzdem nicht =/
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.04.2012, 10:20     Titel:
  Antworten mit Zitat      
Anonymous hat Folgendes geschrieben:
Oh stimmt. Sorry^^
Ja das die Initialisierung aus den FOR-Schlaufen muss ist klar.
Aber schneller wirds auch so trotzdem nicht =/


Schmeiße doch Profiler an , um zu sehen wo der Schuh drückt.
Aber es liegt nicht an Initialisierung, für 200 Elemente Platz einzulegen, ist kein Ding.
Falls du nicht weiter kommst, poste deinen Code, vielleicht kann man da erkennen was du falsch machst
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 11:17     Titel:
  Antworten mit Zitat      
Hmm ich werde irgendwie nicht ganz schlau aus dem profile...
Ich schieb mal den code rein, wenn wer lust hat kann er ja mal durchschauen^^ ich weiss nicht vll. ist 1 minute dafür auch normal.
Ziel von dem Code ist es, aus einer kompletten Signalantwort jeweils die stationären Phasen auszuschneiden und als einzelne Teile abzuspeichern.

Code:

function [ parts, duration , quantity] = steadystate(state,signal,limit,minlength)

load(signal)
l_tot=length(yy);
k=0;
range=0;
Number=0;
mean_range=50;
    for i=mean_range+1:(l_tot-mean_range)
        z1=0;
        z2=0;
       
        for u=i:i+mean_range                                                %Durchschnitt der Werte von i bis i+mean_range
            d1=yy(state,u);
            z1=z1+d1;
        end
       
        for v=i-mean_range:i                                                %Durchschnitt der Werte von i-mean_range bis i
        d2=yy(state,v);
        z2=z2+d2;
        end
       
        z1=z1/(mean_range+1);                                               % Durchschnitte normiert auf die länge, damit die limiten gleich sind
        z2=z2/(mean_range+1);
       
        if abs(yy(state,i)-yy(state,i+1))<limit/1.5 && abs(z1-z2)<(limit)   % Bedingungen:  werte i und i+1 müssen nahe beeinander liegen (ausreisser ausschalten)
            k=k+1;                                                          %               Die Durchschnitte vorher und nacher müssen gleich sein
            range=k;
       
        else k=0;
        end
       
        if k==0 && range> minlength                                             % Abspeichern aller Stationären Teile welche länger als minlength iterationen sind
       
            for j=range:-1:1
            value(range-j+1)=yy(state,i-j);                            
            iter(range-j+1)=i-j;
       
            end
           
            range=0;
            Number=Number+1;
       
            for t=Number
            parts(t,:)=struct('state',value,'iterations',iter,'place',t);
            end
           
            value=0;
            iter=0;
        end
    end
   
    l_needed=0;
   
    for f=1:Number
    part=length(parts(f,1).state);
    l_needed=l_needed+part;

    end
   
    quantity= Number;
    duration=l_needed/l_tot;  
end
 
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.04.2012, 18:27     Titel:
  Antworten mit Zitat      
Hallo

man kann ein Paar Schleifen los werden, ich verstehe aber nicht den ganzen Code

Code:

function [ parts, duration , quantity] = steadystate(state,signal,limit,minlength)

load(signal)

l_tot      = length(yy);
k          = 0;
range      = 0;
Number     = 0;
mean_range = 50;

% struct außen erzeugen nicht in der schleife
parts      = struct('state',cell(200,1),'iterations',[],'place',[]);

for i = mean_range+1:(l_tot-mean_range)
   
  % Man knn Mittelwert auch direkt mit mean berechnen
   z1 = mean(yy(state,i:i+mean_range));
   z2 = mean(yy(state,i-mean_range:i));

   
% das verstehe ich nicht
   if abs(yy(state,i)-yy(state,i+1))<limit/1.5 && abs(z1-z2)<(limit)   % Bedingungen:  werte i und i+1 müssen nahe beeinander liegen (ausreisser ausschalten)
      k     = k+1;                                                          %               Die Durchschnitte vorher und nacher müssen gleich sein
      range = k;    
   else
      k     = 0;
   end
   
   if k==0 && range > minlength                                             % Abspeichern aller Stationären Teile welche länger als minlength iterationen sind
     
      for j=range:-1:1
         value(range-j+1) = yy(state,i-j);
         iter(range-j+1)  = i-j;
         
      end
     
      range                    = 0;
      Number                   = Number+1;
     
  % for schleife hat hier keinen Sinn gemacht
  % wird je einmal ausgeführt
      parts(Number).state      = value;
      parts(Number).iterations = iter;
      parts(Number).place      = Number;      
      value                    = 0;
      iter                     = 0;
   end
end

l_needed = 0;

for f = 1:Number
   part     = length(parts(f,1).state);
   l_needed = l_needed+part;
   
end

quantity =  Number;
duration = l_needed/l_tot;
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2012, 22:32     Titel:
  Antworten mit Zitat      
Hallo,

Mittelwertberechnung ist nur nötig, wenn erste Bedingung erfüllt ist,
je nach dem, wie selten das der Fall ist, kann es die Schleife stark beschleunigen...
und noch eine Schleife weniger

Code:

function [ parts, duration , quantity] = steadystate(state,signal,limit,minlength)

load(signal)

l_tot      = length(yy);
k = 0;
range      = 0;
Number     = 0;
mean_range = 50;

% struct außen erzeugen nicht in der schleife
parts      = struct('state',cell(200,1),'iterations',[],'place',[]);

for i = mean_range+1:(l_tot-mean_range)
  if abs(yy(state,i)-yy(state,i+1))<limit/1.5  % Bedingungen:  werte i und i+1 müssen nahe beeinander liegen (ausreisser ausschalten)
    % Mittelwert nur berechnen, wenn erste Bedingung erfüllt ist
    z1 = mean(yy(state,i:i+mean_range));
    z2 = mean(yy(state,i-mean_range:i));
    % zweite Bedingung:
    if abs(z1-z2)<(limit)    % Die Durchschnitte vorher und nacher müssen gleich sein
      k  = k+1;                                                        
      range = k;    
    else
      k = 0;
    end
  else
    k = 0;
  end
   
  if k==0 && range > minlength   % Abspeichern aller Stationären Teile welche länger als minlength iterationen sind
    range = 0;
    % warum hier j rückwärts läuft, versteh ich nicht
    % es wird auch nur ein Vektor in einen anderen kopiert
    value = yy(state,i-range:i-1);
    iter = (i-range:i-1);
     
      Number                   = Number+1;
     
    % for schleife hat hier keinen Sinn gemacht
    % wird je einmal ausgeführt
    parts(Number).state      = value;
    parts(Number).iterations = iter;
    parts(Number).place      = Number;      
  end
end

l_needed = 0;

for f = 1:Number
   part     = length(parts(f,1).state);
   l_needed = l_needed+part;
   
end

quantity =  Number;
duration = l_needed/l_tot;
end


Gruß
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2012, 13:13     Titel:
  Antworten mit Zitat      
Wow danke. Ist gleich 5 mal so schnell Wink
 
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 - 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.