www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Binäre Dateien in MATLAB
Binäre Dateien in MATLAB < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Binäre Dateien in MATLAB: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 21:03 Sa 01.12.2007
Autor: morz

Hallo,

ich hab folgendes Problem und hoffe, dass mir jemand helfen kann. Ich muss ein in FORTRAN geschriebenes Modell von einem Rechner (CRAY) auf einen anderen (NEC) übertragen. Das hat alles soweit ganz gut geklappt. Nur kann das Modell die Inputdatenfiles, die aus mehreren aneinander gereihten Arrays bestehen, nicht mehr lesen. Sie liegen binär vor.
Nun war meine Idee, die Dateien in Matlab einzulesen und sie "lesbar" (z.B. in ASCII wieder rauszuschreiben). Da ich mir aber über das genaue Format (big/little endian, float32, float64 o.ä.?) beim Einlesen nicht sicher bin und Matlab unerfahren bin, suche ich jetzt um eure Hilfe und Tips. Arraydimensionen sind bekannt.

Danke schon im voraus,

Morz

P.S.: Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.

        
Bezug
Binäre Dateien in MATLAB: Antwort
Status: (Antwort) fertig Status 
Datum: 21:59 Sa 01.12.2007
Autor: Martin243

Hallo und [willkommenmr],

welche Art von Tipps meinst du denn? Wo kommen die Daten her? Hast du vielleicht eine Beispieldatei? Soll es unbedingt Matlab sein?
Ich denke, mit ein paar Angaben mehr wird es schon gehen...


Gruß
Martin

Bezug
                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 11:23 So 02.12.2007
Autor: morz

Hallo Martin,

danke für deine schnelle Antwort. Kannst du mir bitte eine Email(adresse) schicken? Dann kann ich dir eine Beispieldatei anhängen und sag dazu, was ich weiß. Und, nein, es muß überhaupt nicht MATLAB sein.

Danke.

Morz

P.S.: Meine Email: morz@gmx.de

Bezug
                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 21:03 So 02.12.2007
Autor: morz

Hallo Martin,

nein, die Daten sind, soweit ich weiss nicht vertraulich. Ich wusste einfach nicht, dass Dateianhaenge moeglich sind.
Hier ist eine dieser Inputdateien. Sie ist das Outputfile des globalen Ozeanzirkulationsmodells LSG und beinhaltet folgende physikalische Groessen als Felder hintereinander gereiht: Geschwindigkeitsfeld u,v,w; Tempereatur und Salinitaet, convective adjustment, Tiefe in Vektor- und Skalarpunkten  und die Schichtdicke in Vektor- und Skalarpunkten. Das sind 10 Felder, wobei alle die Dimensionenen 72x76x15 haben, bis auf die Tiefen, die natuerlich nur 72x76 sind.
Dieses Daten muessen (neben anderen) in ein biogeochemisches Modell eingelesen werden, welches dann Algen- und Planktonwachstum u.ae. berechnet.
Was moechtest du sonstnoch zu dem File und dem Problem wissen?

[a][Dateianhang Nr. 1 (fehlt/gelöscht)]

Gruss,
Morz

Bezug
                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 21:04 So 02.12.2007
Autor: morz

Hallo Martin,

nein, die Daten sind, soweit ich weiss nicht vertraulich. Ich wusste einfach nicht, dass Dateianhaenge moeglich sind.
Hier ist eine dieser Inputdateien. Sie ist das Outputfile des globalen Ozeanzirkulationsmodells LSG und beinhaltet folgende physikalische Groessen als Felder hintereinander gereiht: Geschwindigkeitsfeld u,v,w; Tempereatur und Salinitaet, convective adjustment, Tiefe in Vektor- und Skalarpunkten  und die Schichtdicke in Vektor- und Skalarpunkten. Das sind 10 Felder, wobei alle die Dimensionenen 72x76x15 haben, bis auf die Tiefen, die natuerlich nur 72x76 sind.
Dieses Daten muessen (neben anderen) in ein biogeochemisches Modell eingelesen werden, welches dann Algen- und Planktonwachstum u.ae. berechnet.
Was moechtest du sonstnoch zu dem File und dem Problem wissen?

[a]DOSREC

Gruss,
Morz

Dateianhänge:
Anhang Nr. 1 (Typ: unbekannt) [nicht öffentlich]
Bezug
                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 22:10 So 02.12.2007
Autor: Martin243

Hallo,

> Was moechtest du sonstnoch zu dem File und dem Problem wissen?

Na, zuerst einmal: Wo ist das File? Versuch das vielleicht nochmal. Unter dem Texteingabefeld gibt es den Javascript-Link "Datei-Anhang". Draufklicken, den in der Textzeile erscheinenden Text kopieren, hier einfügen, absenden und das Hochladen nicht vergessen. Hier scheint jedenfalls etwas schiefgelaufen zu sein.
Bei wiederholtem Scheitern kannst du mir das ja auch per eMail schicken.

Weitere Fragen:
Verstehe ich das richtig, dass du weder die Datentypen der Werte noch die Endianness der Architektur kennst? Oder hast du wenigstens Anhaltspunkte?

Was sind Vektor- und Skalarpunkte?

Eher inhaltlich:
Geben die Dimensionen 3D-Koordinaten an? Was bedeutet dann die Tiefe
an einem 2D-Punkt, wenn die anderen Werte in verschiedenen Tiefen (3. Koordinate?) gemessen wurden?

Na ja, ich warte erstmal die Datei ab.


Gruß
Martin

Bezug
                                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:26 So 02.12.2007
Autor: morz

Hallo Martin,

da das File vermutlich zu gross war, hatte ich es dir gleich per Email geschickt.

>Verstehe ich das richtig, dass du weder die Datentypen der Werte noch die Endianness der Architektur kennst? Oder hast du wenigstens Anhaltspunkte?

Das es eine CRAY-Maschine war, die diese Daten geschrieben hat, sind die Daten vermutlich in big endian. Es gibt aber auch CRAYs mit little endian. Und die Datentypen sind "real" in Fortran Nomenklatur. Oder float bei anderer Namensgebung. Allerdings weiß ich nicht, ob die real-Werte in 4Bytes oder 8Bytes (alles andere ist unwahrscheinlich) geschrieben wurden.

>Was sind Vektor- und Skalarpunkte?
Das ist für die Geschichte nicht wirklich wichtig, aber wenn man Differentialgleichungen diskretisiert und auf ein Gitter setzt, fallen die Punkte, an denen die Vektoren (z.B. Strömungsgeschwindigkeit) noch definiert sind, nicht mehr notwendigerweise mit den Punkten, auf denen Skalare (z.B. Temperatur) definiert sind, zusammen. Wegen der physikalischen Aussagekraft ist das sogar meist nichtmal gewünscht.

>Geben die Dimensionen 3D-Koordinaten an? Was bedeutet dann die Tiefe
an einem 2D-Punkt, wenn die anderen Werte in verschiedenen Tiefen (3. Koordinate?) gemessen wurden?

Ja. Die Erde ist, besser die Ozeane sind (relativ grob in diesem Modell) in 72 Punkte zonal (x), 76 Punkte meridonal (y) und 15 Schichten Tiefe aufgeteilt. Das ist das Gitter. Die Tiefenschichten sind dabei nicht gleich groß. Da man außerdem noch ein grobes Bodenprofil des Ozeans drunter legt, muß in den jeweiligen Vektor- und Skalarpunkten (s.o.) noch die Gesamttiefe von der Meeresoberfläche bis zum Grund angegeben werden (um halbweg realistische Werte zu bekommen). Diese Angaben beinhalten daher nur x- und y-Koordinaten.

Wenn du noch etwas wissen möchtest, sag gerne Bescheid.

Morz

Bezug
                                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 12:24 Mo 03.12.2007
Autor: Martin243

Hallo,

ich glaube, ich habe das hinbekommen. Zumindest sehen die Daten in einer Surf-Grafik jeweils wie Messdaten aus.

Schau dir einfach mal mein [a]cray2ascii-Skript an und frag dann, falls etwas unklar ist.
Falls du dir die Daten auch schon in Matlab ansehen willst, dann musst du nur die clear-Aufrufe entfernen und schon sind die Daten unter den dort angegeben Variablennamen zugreifbar.


Gruß
Martin

Dateianhänge:
Anhang Nr. 1 (Typ: m) [nicht öffentlich]
Bezug
                                                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 18:46 Mo 03.12.2007
Autor: morz

Hallo Martin,

grandios. Ja, dein Skript tut genau das, was ich nicht hinbekommen habe. Großes Dankeschön. Hey, wenn es mich mal nach Bielefeld verschlägt, geb ich dir ein Bier aus!!!

Gruß,

Morz

Bezug
                                                                
Bezug
Binäre Dateien in MATLAB: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 11:32 Di 04.12.2007
Autor: morz

Hallo Martin,  

ich nochmal. Ich habe gerade dein Skript auf andere Dateien übertragen. Dabei tritt ein Shift von einem Zeichen auf. Kannst du mir sagen, wie ich das allerste Zeichen in der Datei ausschneiden kann? Danke

Gruß,
Morz

Bezug
                                                                        
Bezug
Binäre Dateien in MATLAB: Antwort
Status: (Antwort) fertig Status 
Datum: 11:43 Di 04.12.2007
Autor: Martin243

Hallo,

auch das ist möglich. Du musst nur das Einlesen der Datei modifizieren. Wenn skip die Anzahl der zu überspringenden Bytes ist, dann musst du das Einlesen ergänzen wie folgt:

fid = fopen(filename, 'r', 'c');
fseek(fid, skip, 'bof');
data = fread(fid, inf, 'float64', 'cray');
fclose(fid);


Gruß
Martin

Bezug
                                                                                
Bezug
Binäre Dateien in MATLAB: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 12:58 Di 04.12.2007
Autor: morz

Danke. Aber ich hab grad festgestellt, daß das die falsche Taktik war. In dem anderen File stehen die Geschwindigkeiten u und v, convective adjustment, die Temperatur, Salinität und Meereseis. Und zwar monatsweise hintereinander. Jedesmal wenn ein Monat komplett ist, verschiebt sich alles um ein Zeichen, d.h. im Januar ist z.B. noch korrekt, im Februar hat sie im ersten Spalteneintrag eine Temperatur stehen und im Dezember an den ersten 11 Spalteneinträgen (1,77,153 usw.). Wie kann ich nach jedem Monat einen Shift von einer Zahl = 8 Bytes einbauen?
Im Anhang dein (etwas unelegant )modifiziertes Skript.

Gruß,

Morz


Dateianhänge:
Anhang Nr. 1 (Typ: m) [nicht öffentlich]
Bezug
                                                                                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 13:22 Di 04.12.2007
Autor: Martin243

Hmmm, zwei Fragen:
1. Woher weiß ich, wann ein Monat vorbei ist? Passieren die Messungen täglich? Wöchentlich?

2. Wie ist das nochmal zu verstehen:
Geschwindigkeit u, ..., Meereseis für Januar
Geschwindigkeit u, ..., Meereseis für Februar
Geschwindigkeit u, ..., Meereseis für März
...

oder
Geschwindkeit u für Januar, Februar, März...
Geschwindkeit v für Januar, Februar, März...
... (also wie gehabt, nur eben mit der Monatsunterscheidung)


Gruß
Martin

Bezug
                                                                                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 15:33 Di 04.12.2007
Autor: morz

Das sind keine echten Messdaten, sondern ein weiterer Output eines Ozeanzirkulationsmodells. Der Zeitschritt war dabei ein Monat und die Groessen wurden monatsweise rausgeschrieben, also: Geschwindigkeit in x im Januar: u_01, Geschwindigkeit in y im Januar: v_01......Meereeis im Januar ice_01, Geschwindigkeit in x im Februar: u_02, ...... ,........Meereis im Dezember ice_12. Macht insgesamt 72 Arrays...

Bezug
                                                                                                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 15:51 Di 04.12.2007
Autor: Martin243

Meinst, du könntest mir die Datei auch mal schicken?
Ich habe zwar schon eine Vorstellung davon, aber Trockenübungen ohne Testmöglichkeit führen wahrscheinlich zu Fehlern...
Es könnte aber schon bis morgen dauern. Ich habe ncht soo viel Zeit und ich fürchte, dass das Einlesen der Daten komplett umgeschrieben werden muss.


Gruß
Martin

Bezug
                                                                                                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 19:13 Di 04.12.2007
Autor: morz

Tschuldigung. Ich kam erst jetzt wieder ins Netz. Ich schick dir das File zu, falls die Uni nicht vorher ein Limit fuer Dateianhaenge saetzt. Und mach dir keinen Stress. Ich bin ja schon sehr froh, dass du dich meinen Fragen annimmst.

Gruss,

Morz

Bezug
                                                                                        
Bezug
Binäre Dateien in MATLAB: Antwort
Status: (Antwort) fertig Status 
Datum: 09:24 Mi 05.12.2007
Autor: Martin243

Hallo,

jetzt, wo ich das Problem verstehe, habe ich eine einfache Lösung gefunden. Du wirst dir an den Kopf packen:
Da sich das eine 64-bit-Wort nach jedem Monat wiederholt, behandeln wir es einfach als ein 1x1x1-Datenfeld, das wir beim Schreiben der Dateien dann verwerfen...
Ich habe das mal ins Skript eingebaut um dann auch gleich die Erzeugung der Variablen- und Dateinamen etwas vereinfacht: [a]updated Cray2ASCII-MegaConverter.m

Bierliste: ||


Gruß
Martin

Dateianhänge:
Anhang Nr. 1 (Typ: m) [nicht öffentlich]
Bezug
                                                                                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 09:44 Mi 05.12.2007
Autor: morz

Hallo,

korrekt. Da hätte ich auch selbst drauf kommen können. Großes Dankeschön nochmal und das Bier ist vorgemerkt.

Gruß
Morz

Bezug
                                                                                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 14:10 Do 06.12.2007
Autor: morz

Hallo Martin,

damit ich die Daten wieder vollständig benutzen kann, muß ich zu allerletzt die ASCII-Files mit Fortan wieder einlesen und zu einem binären File wieder zusammensetzen.
Mit den 2D Feldern (Tiefe) klappt das problemlos. Aber die 3D-Felder (Geschwindigkeit u.ä.) weigern sich hartnäcktig. Ich hab jetzt herausgefunden warum: Die 2D haben einen Zeilenumbruch nach 76 Werten, sind bei einer Matrix (72,76) spaltenweise geschrieben, was wunderbar ist.
Bei den 3D Feldern existieren 136 Zeilenumbrüche. Wie kommt es zu denen? Wie werden die §D Felder nach einem Skript genau geschrieben?

%Zuweisen der einzelnen Datenabsschnitte zu Variablen

for i = 1:length(vars),

array_size = prod(array_dims(i, :));

current_data = squeeze(reshape(data(offset + (1:array_size)), array_dims(i, :)));

if read_rowwise,

current_data = permute(current_data, [2 1 (3:ndims(current_data))]);

end;

assignin('base', vars{i}, current_data);

offset = offset + array_size;

end;



clear data;

clear current_data;



%Schreiben der Daten in einzelne ASCII-Dateien

for i = 1:length(vars),

filename = [vars{i} file_extension];

data = eval(vars{i});

if write_rowwise,

data = permute(data, [(3:ndims(data)) 2 1]);

else

data = permute(data, [(3:ndims(data)) 1 2]);

end;

dlmwrite(filename, data, 'delimiter', delimiter, 'precision', precision);

end;



Gruss,
Morz

Bezug
                                                                                                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 15:30 Do 06.12.2007
Autor: Martin243

Hallo,

> Wie werden die §D Felder nach einem Skript genau geschrieben?

Nun, ich habe nicht explizit zwischen 2D und 3D unterschieden, aber ich denke, dass Matlab immer bei der letzten Dimension umbricht. Deshalb bekomme ich:
[72 76] => 72 Zeilen à 76 Werte
[72 76 15] => 15 Zeilen à 72*76 Werte

Die 136 kann ich mir nicht erklären. Gibt es bei dir irgendwo (Editor oder Fortran) eine Beschränkung der Zeilenlänge???
Versuch doch mal eine der 3D-Dateien in Matlab per a=load('Dateiname') zu laden und prüfen mal mit size(a) die Größe. Bei mir ist es immer 15 x 5472...

Das gewünscht Format erreichst du (oder zumindest läuft es bei mir), wenn du die Zeile mit dlmwrite(...) ersetzt durch diese beiden:
dlmwrite(filename, squeeze(data(1,:,:)), 'delimiter', delimiter, 'precision', precision);
for third_dim = 2:size(data, 1); dlmwrite(filename, squeeze(data(third_dim,:,:)), '-append', 'delimiter', delimiter, 'precision', precision); end;

Ein Problem waren wohl auch die Singleton-Dimensionen. Deshalb ist da zwischendurch ein squeeze nötig.

Wenn man jetzt z.B. convad_01.txt mit einem Texteditor öffnet, dann kann man da prima im Meer von Nullen kleine Einserflecken sehen. COOL! ASCII-Art!


Gruß
Martin

Bezug
                                                                                                                
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 16:13 Do 06.12.2007
Autor: morz

Das muß wohl mit nem automatischen Zeilenumbruch zu tun gehabt habe.
Und innerhalb einer der 15 Zeilen müßte doch dann alles Spaltenweise, also erst alle 76 y-Werte zu x=1 stehen und dann x=2 mit Y01 bis 76 usw.? Oder?

Bezug
                                                                                                                        
Bezug
Binäre Dateien in MATLAB: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 16:36 Do 06.12.2007
Autor: Martin243


> Und innerhalb einer der 15 Zeilen müßte doch dann alles Spaltenweise, also erst alle 76 y-Werte zu x=1 stehen und dann x=2 mit Y01 bis 76 usw.? Oder?

Hehe, da fragst du mich was. Ich meine, dem ist so. Ich bin da aber ständig durcheinandergekommen, weil Matlab es ja genau andersherum macht.
Ich wusste eigentlich auch nie, wie die Cray-Daten gespeichert sind. Deswegen habe ich auch die Parameter read_rowwise und write_rowwise eingebaut, falls etwas nicht stimmt.
Auf jeden Fall sind die Daten in sich konsistent, also werden die 72 gelesenen Reihen auch als 72 gespeichert und nicht mit den 76 vermischt.
Das zeigen ja auch die oben genannte Einserflecken...

Wenn du allerdings weißt, dass die Cray-Daten so gespeichert waren, dass jeweils eine ganze Spalte geschrieben wurde, dann die nächste, dann kannst du ja read_rowwise = false; setzen. Dann hast du jeweils 76 Zeilen.


Gruß
Martin

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.vorhilfe.de