Es sind 158745 Zeilen insgesamt.
Kleines Skript hab ich auch schon geschrieben. Es funktioniert auch. Ich bekomme allerdings immer eine Fehlermeldung nachdem die Schleife durchlaufen wurde.
MAtlab sucht immer nach dem nächsten "+3"-Wert, obwohl ich doch die Schleife nur bis zur i-1 Zahl laufen lasse!? Zudem ist das alles auch ein bisschen umständlich geschrieben und frisst viel Rechenzeit. Gibts da noch einen anderen Weg?
Hallo surfer,
was für eine Fehlermeldung? und nachdem WELCHE schleife durchlaufen wurde?
Poste doch einfach mal die vollständige Fehlermeldung.
Zitat:
obwohl ich doch die Schleife nur bis zur i-1 Zahl laufen lasse!?
wo tust du das? deine Schleifen laufen bis 158740, bzw. 158741, bzw. 158742
p.s.: was beinhaltet period/ID/ID50?
in der ersten schleife hast du Data985 stehen... meinst du da nicht eher Data1985?
Irgendwie glaub ich ja nicht so ganz, dass dieser Code so funktioniert...
_________________
Matlab bricht nach der ersten for-Schleife ab. Das Ergebnis ist jedoch korrekt. (mit aussortierten 52915 Zeilen)
Führt man die danachfolgenden Schleifen auch noch separat aus, werden die Dateien richtig eingelesen, was mir aber nichts bringt wenn ich zum Beispiel eine Funktion drausbasteln will.
Die Fehlermeldung für die erste Schleife lautet:
??? Attempted to access A1B(158746,; index out of bounds because size(Data)=[158745,3]
Ich versteh den Fehler ja auch: Matlab sucht den nächsten +3-Wert. Was ich nicht verstehe ist, warum Matlab noch weitersucht, obwohl ich ganz klar das Ende der Schleife angegeben habe.
Und ja:da ist ein Tipfehler. Es muss 1985 heißen. Ich habe die Bezeichnungen ein bisschen vereinfacht.
Surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.02.2011, 14:11
Titel:
also:
für den ersten Zeitraum 1985 lasse ich die Schleife ja bis zur 158740 laufen, da die 158743 die letzte Zahl aus diesem Zeitraum ist, die ich ausgegeben haben möchte.
die frage ist, ob das ganze auch ohne die for-Schleifen-Konstruktion geht?!
ALso um die Daten einfach zu filtern und jeweils in einem struct zu sammeln, könnte man das so angehen:
Code:
fid = fopen('allYears_Run1.txt', 'r'); % Datei zum lesen öffnen
structure1985 = {}; % Variable für struct anlegen
structure1999 = {}; % Variable für struct anlegen
structure2005 = {}; % Variable für struct anlegen
while1 %Endlosschleife
tline = fgetl(fid); % nächste Zeile einlesen if ~ischar(tline), break, end% Wenn Dateiende erreicht -> beende Schleife
line_parts = regexp(tline, '\s', 'split'); %Teile den string(die Zeile) bei
%den Leerzeichen auf
switch line_parts{2}(1:4) %Unterscheide zwischen den ersten Jahreszahlen
case '1985'
index = length(structure1985)+1; %index für neuen Datensatz
structure1985(index).ID = str2double(line_parts{1}); %ID ablegen
structure1985(index).ID50 = str2double(line_parts{3}); %ID50 ablegen
case '1999'
index = length(structure1999)+1;
structure1999(index).ID = str2double(line_parts{1});
structure1999(index).ID50 = str2double(line_parts{3});
case '2005'
index = length(structure2005)+1;
structure2005(index).ID = str2double(line_parts{1});
structure2005(index).ID50 = str2double(line_parts{3});
end end fclose(fid);
Kannst auch alles in ein struct packen. Und Dann Beispielsweise nach dem Jahr filtern.
Oder auch alle ID's und ID50's in ein array packen und dann im struct unterbringen.
Zuletzt bearbeitet von _Peter_ am 23.02.2011, 16:49, insgesamt 2-mal bearbeitet
Surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.02.2011, 15:46
Titel:
Oha! Vielen Dank erstmal für deine Antwort!
So bin ich das noch nie angegangen, aber man lernt ja immer weiter dazu:
also kurz nochmal fürs Verständnis:
-öffnen der Input_Datei und Erstellen von 3 Structs in die die Ergebnisse dann geschrieben werden sollen, jetzt aber noch leer sind!
- Einlesen der Daten als String (verwendest ja fgetl)
- bei den nächsten 3 Zeilen komm ich irgendwie nicht weiter, was da gemacht wird!
- und dann fallunterscheidung:
falls 1985 in array 2, spalte 1:4 (warum 4?- weil der Zeitperiodenstring auseinander genommen wurde?also spalte1= ID, spalte2=Periodestart, spalte3=periodeende, spalte4=ID50??),
dann wandle die strings des jeweiligen Parameters in double um
-analog wird dann für die beiden anderen Zeitperioden verfahren
hab ich das soweit richtig verstanden? wills eben auch richtig verstehen und nicht bloß abtippen!
Ja du hast es soweit richtig verstanden.
Ich habe jetzt nochmal den Code im oberen post ein bisschen kommentiert.
weiterhin:
fgetl zieht immer die nächste Zeile aus dem Textdokument. (IMMER NUR EINE ZEILE!)
Wenn das Ende des Dokuments erreicht ist gibt getl eine -1 zurück. Das ist dann kein string mehr deswegen die prüfung
ist folglich nur die Zahl 1985. man kann aber auch den kompletten string vergleichen. Ich habe mich einfach nur an deinem beispiel orientiert wo du nur die erste Jahreszahl in betracht ziehst.
p.s.: Es ist immer gut es auch selbst verstehen zu wollen _________________
Vielen Dank...Ich konnte es gut in mein Script einbasteln und es funktioniert auch! Super!
Toll auf wievielen verschiedenen Wegen man in Matlab ein Problem lösen kann!
Einstellungen und Berechtigungen
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.