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
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)
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?
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.04.2012, 09:58
Titel:
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?
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.
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.04.2012, 10:09
Titel:
Oh stimmt. Sorry^^
Ja das die Initialisierung aus den FOR-Schlaufen muss ist klar.
Aber schneller wirds auch so trotzdem nicht =/
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
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.04.2012, 11:17
Titel:
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.
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);
ifabs(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;
% 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 ifabs(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;
% 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;
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
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) ifabs(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: ifabs(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;
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.