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

fwrite und .mat-files. Spalte an eine Matrix anhängen.

 

Albev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2013, 13:06     Titel: fwrite und .mat-files. Spalte an eine Matrix anhängen.
  Antworten mit Zitat      
Hi,

ich habe folgendes Problem: Ich habe eine sehr große Datei als .mat-file abgespeichert. Nun möchte ich bei Bedarf noch eine Spalte hinzufügen, ohne dass erst die gesamte Matrix in den Arbeitsspeicher geladen werden muss. fopen, fwrite, etc scheint dafür da zu sein, aber wenn ich damit arbeite, kann ich die .matfiles am Ende nicht mehr öffnen bzw. enthalten nicht das erwartete Ergebnis. Hier mal ein Minimalbeispiel:

Code:

%% Schritt 1
fclose('all');
clear all
delete('test.mat');

test=magic(5);
save('test.mat','test','-v7.3');
clear all

%% Schritt 2
fid=fopen('test.mat','a');
fwrite(fid,magic(5));
fclose(fid);

%% Schritt 3
fid=fopen('test.mat');
testRead=fread(fid,[5,10])
fclose('all');

%% Schritt 4
load test.mat
testLoad=test


Das Ergebnis, dass ich erwarte, ist, ein .mat-file mit einer Matrix, die [magic(5),magic(5)] entspricht und das selbe einmal als Ausgabe durch den fread-Befehl in Schritt 3.

Führe ich alle Schritte nacheinander aus, erhalte ich ein test.mat in dem eine 5x5 Matrix mit magic(5) steht, und folgende Ausgabe
Code:

testRead =

    77    66    32   102    32   102    32    78    67   101
    65    32    77   105    80   111    80    54   114   100
    84    55    65   108   108   114    67    52   101    32
    76    46    84   101    97   109    87    44    97   111
    65    51    45    44   116    58    73    32   116   110


testLoad =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9


Das verwirrt mich schonmal sehr. Wie können in test.mat zwei unterschiedliche Matrizen unterschiedlicher Größe stecken?
Lösche ich anschließend test.mat wieder und führe nur Schritt 2 bis 4 aus, so erhalte ich folgende Ausgabe:
Code:

testRead =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

??? Error using ==> load
Unable to read MAT-file [...]\MATLAB\test.mat: not a binary MAT-file.
Try LOAD -ASCII to read as text.

Diesmal verhält sich also fread wie erwartet, aber das .mat-file kann nicht mehr durch load geöffnet werden... load -ascii bewirkt auch nichts:
Code:

??? Error using ==> load
Number of columns on line 1 of ASCII file [...]\MATLAB\test.mat
must be the same as previous lines.


Was mache ich falsch? Sind fopen,fwrite usw. einfach nicht kompatibel mit .mat-files?

testscript.m
 Beschreibung:

Download
 Dateiname:  testscript.m
 Dateigröße:  334 Bytes
 Heruntergeladen:  329 mal


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.03.2013, 15:59     Titel:
  Antworten mit Zitat      
Hallo
Zitat:

Was mache ich falsch? Sind fopen,fwrite usw. einfach nicht kompatibel mit .mat-files?


Matlab benutzt intern Komprimierungsalgorithmen um die Daten optimal zu speichern, und deshalb kann man mit FREAD und FWRITE so nicht auf den Inhalt der MAT-Datei zugreifen.
Nur in Modus '-v6' speichert Matlab MAT-Dateien ohne Komprimierung. Hier wäre das noch eventuell so was möglich:
Code:

test=magic(5);
save('test.mat','test','-v6');

% auslesen
fid=fopen('test.mat','rb');
fseek(fid,184,-1)
testRead=fread(fid,[5 5],'*uint8', 'ieee-le')
fclose(fid)
 


Also mit FREAD und FWRITE ist nicht einfach in MAT-Files zu arbeiten, wenn FREAD und FWRITE unbedingt sein müssen, da suche dir nach Lösungen oder Ideen auf FEX:

http://www.mathworks.com/matlabcent.....-corruption-analysis-tool

http://www.mathworks.com/matlabcent.....file-and-matrix-utilities

SONST rate ich dir die Funktion MATFILE anzuschauen, vielleicht hilft es dir weiter
so könnte man die Matrix mit MATFILE erweitern:
Code:

test=magic(5);
save('test.mat','test','-v7.3')
clear test
mObj = matfile('test.mat')
mObj.Properties.Writable=true;
mObj.test(:,end+1) = [1:5]'
clear mObj

load test.mat

 
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: 25.03.2013, 16:26     Titel: Re: fwrite und .mat-files. Spalte an eine Matrix anhängen.
  Antworten mit Zitat      
Hallo Albev,

MAT is ein binäres File-Format. darin werden die Daten nach einem nicht-trivialen Muster abgespeichert. Man kann zwar prinzipiell alle binären File-Formate mit FREAD und FWRITE behandeln, dafür muss man aber die genaue Struktur des Formates berücksichtigen. Einfach mal eben Werte anhängen ist z.B. nicht möglich.
Neben den Daten enthalten die MAT Files auch den Typ und die Dimensionen der Variablen, sowie einen Header, der das genaue Format spezifiziert. Zuden können, wie bereits gesagt, die Daten auch komprimiert sein.

Grundsätzlich sind FREAD/FRWITE also kompatibel mit MAT-Files, im konkreten Fall ist das aber so kompliziert, dass ich unbedingt davon abraten würde. Hinter Matlab's LOAD und SAVE stehen gewaltige Libraries, die man nicht mal soeben nachprogrammieren kann.

Es gibt aber noch eine andere Schwierigkeit: Das sukksessive Anhängen von Daten ist immer eine ausgesprochen teuere Prozedur. Es muss immer erst das gesamte File gelesen werden, um das Ende zu finden. Das Anhängen neuer Daten kann zur Disk-Fragmentierung führen. Das Anfügen einer Zeile an eine Matrix erfordert immer das Einlesen der Daten, ein selbst im RAM teures Erweitern der Matrix und Kopieren der alten und neuen Werte, und danach ein Zurückschreiben. Dies ist bei Software-Ingenieuren als "Shlemiel the painter"-Problem bekannt (Google findet mehr dazu) und wird unbedingt vermieden.

Lösungen: Pre-allocation, also so viel Speicher wie zum Schluss benötigt, reservieren - lieber zu viel also zu wenig. FWRITE ist eine gute Idee, aber nicht mit dem MAT-Format, sondern mit einem zu Deinem Problem passenden Format.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Albev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2013, 16:29     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort.

FREAD und FWRITE müssen es nicht unbedingt sein, deshalb sieht die zweite Lösung ganz interessant aus, leider kennt mein Matlab (2010a) die Funktion nicht. Schade, dass scheint genau das zu sein, was ich mir vorstelle.

'-v6' dürfte leider nicht funktionieren. Default ist bei mir '-v7' und da sagt Matlab, dass er die Matrix nicht abspeichern kann, also wird '-v6' wohl auch nicht gehen.

Ich gucke mir die beiden Links noch an, vielleicht finde ich ja etwas. Im Notfall muss ich wohl ganz auf .mat verzichten und .bin(?) benutzen.
 
Albev

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2013, 16:39     Titel: Re: fwrite und .mat-files. Spalte an eine Matrix anhängen.
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo Albev,

[...]

Lösungen: Pre-allocation, also so viel Speicher wie zum Schluss benötigt, reservieren - lieber zu viel also zu wenig. FWRITE ist eine gute Idee, aber nicht mit dem MAT-Format, sondern mit einem zu Deinem Problem passenden Format.

Gruß, Jan


Auch dir Danke, für deine schnelle Antwort.

Leider kann ich nicht sagen, wie groß es später wird. Ich möchte gerne einen Klassifikator trainieren und nachträglich immer, wenn er ein Beispiel falsch behandelt hat, dieses Beispiel dem Trainingspool hinzufügen.
Ich kenne mich mit den Dateiformaten leider nicht so gut aus. In den Beispielen zu FWRITE und FREAD habe ich immer .bin gefunden. Ich benutze eine double Matrix.

Grüße,
Albev
 
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.