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

Einleseproblem

 

Hallo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2008, 22:26     Titel: Einleseproblem
  Antworten mit Zitat      
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

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 20.02.2008, 09:46     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
hallo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2008, 10:08     Titel: ...
  Antworten mit Zitat      
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

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 20.02.2008, 10:32     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hallo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2008, 10:49     Titel: ...
  Antworten mit Zitat      
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

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 20.02.2008, 11:14     Titel:
  Antworten mit Zitat      
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:
Code:

% ...
status = 0;

while status == 0
A = fread(fid, [channel, rows], 'uint16')
position=ftell(fid)

% ... normaler Code

status = fseek(fid,position,'bof')
end
% ...
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hallo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2008, 12:08     Titel: ...
  Antworten mit Zitat      
danke keloid

funktioniert !!!!
 
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 - 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.