|
Hallo |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.02.2008, 21:26
Titel: Einleseproblem
|
|
Hi leute
bin ein neuling im gebiet matlab und hätte eine frage:
ich habe daten von einer Messreihe und will diese nicht im ganzen sondern teilweise einlesen um den out of memory Fehler zu umgehen, weil es ziemlich große daten sind
bin mitlerweile soweit gekommen[quote]
fp = 'ist der filename'
fid =fopen(fp)
channel = 4
rows = 'beliebig'
position = 0
while == 0
status=fseek(fid,position,'cof')
A = fread(fid, [channel, rows], 'uint16')
position=ftell(fid)
.
.
.
.
.
clear A
end
st = fclose(fid)
[code]
meine Frage: warum liest er nicht bis zum schluss ein? und gibt es vielleicht eine elegantere Lösung?[/code][/quote]
|
|
|
|
|
keloid |
Forum-Century
|
|
Beiträge: 216
|
|
|
|
Anmeldedatum: 04.10.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.5.0.342 (R2007b)
|
|
|
|
|
|
Verfasst am: 20.02.2008, 08:46
Titel:
|
|
|
|
|
Ein erster Vorschlag meinerseits wäre, in regelmässigen Abständen Debug-Ausgaben einzutragen.
Dafür bietet sich die Funktion disp() hervorragend an, sie gibt einfach den String, der als Argument dabei steht, im Matlab-Kommandofenster aus.
Wie genau setzt Du die Abbruchbedingung für die while-Schleife um?
So wie Du sie hier beschrieben hast, sollte sie nicht funktionieren, da die Wahrheitsbedingung "== 0" in der Form nichts bringt, da müsste schon eine Variable hin, die dann im weiteren Verlauf der while-Schleife verändert wird.
Oder aber, was programmiertechnisch weniger schön ist, Du schreibst "while 1" und hoffst darauf, dass das Programm durch einen Fehler von fread() abbricht.
Eine letzte Frage habe ich noch zur weiteren Datenverwendung. Möchtest Du die Daten, die Du einliest, gesamt in einem Workspace weiterverwenden? Oder möchtest Du sie Stück für Stück, so wie Du sie einliest, einzeln weiterverarbeiten?
Denn wenn Du sie gesamt weiterverarbeiten willst, sollte es keinen Unterschied machen, ob Du sie Stück für Stück einliest oder an einem Stück.
|
|
|
hallo |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.02.2008, 09:08
Titel: ...
|
|
sorry, hab mich in der while schleife gestern verschrieben
es müsste heissen
while status == 0
.
.
die einzelenen Abschnitte werden auf unregelmäßigkeiten kontrolliert und und dann wieder verworfen
|
|
|
keloid |
Forum-Century
|
|
Beiträge: 216
|
|
|
|
Anmeldedatum: 04.10.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.5.0.342 (R2007b)
|
|
|
|
|
|
Verfasst am: 20.02.2008, 09:32
Titel:
|
|
|
|
|
Okay, wenn die einzelnen Abschnitte getrennt untersucht werden, ist eine solche Stückelung sicherlich sinnvoll ;)
Interessant wäre zu wissen, welche Rückgabewerte fseek hat, in der Hilfe habe ich dazu leider nichts gefunden. Wenn es wie in C ist, sollte es aber Null zurückgeben, wenn es klappt bzw. ungleich Null, wenn es nicht klappt.
Allerdings glaube ich, dass in Deinem Beispiel das fseek und ftell zu einem Problem führt.
Schritt für Schritt:
Der erste fseek-Aufruf bewirkt nichts, cof ist am Anfang des files, eine Verschiebung um Null findet statt.
A = fread() liest eine Anzahl N Zeichen ein, und gibt diese in A aus. danach steht der File Pointer am N+1-ten Byte.
Jetzt wird per ftell der Abstand zum Fileanfang gespeichert.
Beim erneuten Aufruf von fseek wird von cof (current offset, momentane Position in der Datei) position Bytes verschoben, und von da an werden wiederum per fread() neue Daten eingelesen.
Das heisst, Du liest im Schnitt nur die Hälfte Deiner Daten ein.
Um das Problem zu umgehen, gibt es zwei Möglichkeiten.
Möglichkeit 1:
Wenn Du den File-Offset später nicht mehr brauchst, entferne die Zeilen mit fseek und ftell aus Deinem Programm. Der File-Offset-Pointer bleibt automatisch an der Stelle im File stehen, an der er nach dem letzten fread war.
Möglichkeit 2:
Wenn Du den File-Offset noch brauchst, ersetze im fseek-Aufruf "cof" durch "bof" (beginning of file, Dateianfang). Dann sollte der Aufruf wieder stimmen.
Das einzige Problem könnte jetzt noch sein, dass fread im letzten Aufruf einen Fehler liefert, wenn nämlich weniger als die geforderten channel*rows Bytes bis zum Dateiende übrig sind, das weiss ich aber nicht genau.
|
|
|
Hallo |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.02.2008, 09:49
Titel: ...
|
|
es funktioniert leider nicht, aber gibt es irgendwie die möglichkeit dem fread zu sagen wo genau er anfangen soll weiter einzulesen,
weil es mit dem 'bof' auch nicht funktioniert
'bof' verursacht eine endlosschleife
|
|
|
keloid |
Forum-Century
|
|
Beiträge: 216
|
|
|
|
Anmeldedatum: 04.10.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.5.0.342 (R2007b)
|
|
|
|
|
|
Verfasst am: 20.02.2008, 10:14
Titel:
|
|
fread() liest automatisch ab der Stelle, an der der Positionsanzeiger steht. Der wiederum kann entweder durch fread selbst oder durch fseek beeinflusst werden.
Normalerweise sollte der Positionsanzeiger nach fread am ersten Byte nach den eingelesenen Daten stehen.
Versuche mal folgendes:
In dieser Reihenfolge sollte folgendes passieren:
Zuerst werden channel*rows Bytes in A eingelesen. Danach gibt ftell den offset des Positionsanzeigers an. Der wird in fseek verwendet, so dass beim nächsten Durchlauf fread ab der Stelle Dateianfang + alte Position lesen sollte.
|
|
|
Hallo |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.02.2008, 11:08
Titel: ...
|
|
danke keloid
funktioniert !!!!
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|