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

Binary Datei mit unterschiedlichen Datentypen?

 

dummy2k
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2012, 15:57     Titel: Binary Datei mit unterschiedlichen Datentypen?
  Antworten mit Zitat      
Hallo,

ich möchte ein Binary File auslesen und verwende den Befehl "fread". Aus Laufzeitgründen lese ich die Datei als ganzes ein, andernfalls wäre das Skript zu viel langsam.
Nun habe ich das Problem, dass in der Datei neben int32-Werten auch andere Werte wie Single vorkommen. z.B. nach x-Int32-Werte würde dann ein Single-Wert folgen.

Meine Frage: Hat jmd eine Idee wie ich das lösen konnte, ohne es "zeilenweise" auslesen zu müssen?

Danke! Lg, Dummy2k

[EDITED, Jan, Titel verbessert]
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.11.2012, 11:44     Titel: Re: Binary Datei mit unterschiedlichen Datentypen?
  Antworten mit Zitat      
Hallo dummy2k,

Beim Einlesen mit FREAD ist üblicherweise der Festplattenzugriff der Flaschenhals. Eine Datei blockweise mit mehreren FREAD-Befehlen in einer Schleife einzulesen ist kaum bis unmessbar langsamer. Es sei denn, Du hängst die neu eingelesenen Werte an eine nicht-pre-alloziertes Array an. Aber dann ist die fehlende Pre-allozierung das Problem, nicht FREAD.

Man kann die eingelesenen Werte von INT32 nach SINGLE mit dem TYPECAST Befehl konvertieren. Dabei wird das Bitmuster im Speicher nicht verändert, sondern nur der Typ der Variablen. Besonders effizient macht das ein C-Mex-File von James Tursa im FileExchange, aber Matlab's TYPECAST schafft das auch.

Der umgekehrte Weg ist übrigens tückisch: SINGLE nach UINT32 ist nicht stabil, da es "signaling" und "not signaling" NaNs gibt, die unterschiedliche Bitmuster haben. Matlab konvertiert aber alle "signaling" NaNs zu "not-signaling", so dass eventuell das Einlesen die Werte ändert, was nach einer Konvertierung zu INT32 auffällt.

Ich würde trotzdem empfehlen, die Datei blockweise einzulesen und die Konvertierung per FREAD vorzunehmen. Bei ordentlich pre-allozierten Variablen sollte dies schneller sein, da man sich das Erstellen und Konvertieren temporärer Arrays sparen kann.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
dummy2k
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2012, 12:09     Titel:
  Antworten mit Zitat      
Hallo Jan,

wieder mal vielen Dank für deine Antwort! Von nem Profi wie dir ist das nicht selbstverständlich Smile

Aber ganz nachvollziehen kann ich dein Vorschlag nicht. Z.B. möchte ich die Anzahl der Datensätze in einem Binärfile zählen. Dabei dient die MagicNumber als Indikator.

Code:


counter=0;
  while(feof(fid) == 0)
     mn = fread(fid, 1, 'int32');
        if(magicNumber == 1995)
           counter=counter+1;
        end
  end  
 


Wenn ich aber das gesamte File einlese also z.B.

Code:

    completeFile = fread(fid, inf, 'int32');
    counter = 1;
    for i=1: length(completeFile)
       if completeFile(i) == magicNumber
           counter = counter +1;
       end
    end
 


ist das wesentlich schneller. Oder hast du vielleicht etwas anderes gemeint? Sorry, gebs zu mir fehlt etwas das Grundlagenwissen.

@Typecast
Was ist wenn ich aber aus dem Binärfile alles als Int32 auslese und aus diesem Ergebnis dann es zu Single "typecaste"? Das würde nicht funktionieren oder? Oder muß ich da mehrere Int32-Werte "zusammenfügen" ?

Normalerweise hätte mein Skript folgende Struktur:

Code:

wert1 = fread(fid, 1, 'int32');
wert2 = fread(fid, 1, 'int32');
wert3 = fread(fid, 1, 'single');
 


Aber wie erwähnt, ist das Skript dann ziemlich langsam.

Tausend Dank für deine Mühe! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2012, 18:30     Titel:
  Antworten mit Zitat      
Hallo dummy2k,

so ganz habe ich Dein Problem noch nicht verstanden. Haben die int32 bzw. single-Blöcke
eine feste Länge?

Dann einen Block mit x int32-Werten einlesen, danache einen Block
mit y single-Werten. Wenn x bzw. y viel größer als 1 ist, dann gibt es keinen
Geschwindigkeitsunterschied zu x+y int32-Werte lesen.

Übrigens haben single und int32 jeweils 32 Bits, was das typecasten unproblematisch
macht:
Code:
werte=typecast(completeFile(123:456),'single');


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
dummy2k
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 05.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2012, 20:50     Titel:
  Antworten mit Zitat      
Hi Sirus3,

zuerst mal Danke für deine Mühe!

Sirius3 hat Folgendes geschrieben:
Hallo dummy2k,

so ganz habe ich Dein Problem noch nicht verstanden. Haben die int32 bzw. single-Blöcke
eine feste Länge?


Ich bin mir nicht sicher was du meinst, aber die Länge der Datensätze varieren, daher lese ich immer nur einen Block ein. Also fread(fid, 1, 'int32). Mit Block ist doch der Einser gemeint oder?
Wenn ja, macht es schon ein Unterschied, ob ich hintereinander fread(fid,1,'int32') mache oder fread(fid, inf,'int32').


Zitat:

Übrigens haben single und int32 jeweils 32 Bits, was das typecasten unproblematisch
macht:
Code:
werte=typecast(completeFile(123:456),'single');



Ja, dass habe ich mittlerweile auch schon recherchiert, aber Danke für die Bestätigung! Ich weiß auch mittlerweile, wieso bei mir das typecasten nicht funktioniert hat. Ich habe statt
Code:
fread(fid,1,'int32=>int32')


nur

Code:
fread(fid,1,'int32')


eingegeben. Bin davon ausgegangen, dass die Klasse dann automatisch int32 ist Smile Ärgerlich, kleiner Fehler große Wirkung, sprich viel Zeit verplempert mit Recherche und ausprobieren Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
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.