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

Speichern bzw. schreiben einer .mat-Datein in .txt-Datei

 

Thomas K
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2012, 17:45     Titel: Speichern bzw. schreiben einer .mat-Datein in .txt-Datei
  Antworten mit Zitat      
Hallo,

ich habe eine Matrix mit ca. 672000x322 Einträgen und möchte diese in einer Textdatei abspeichern. Mein Code tut auch das was ich mir vorstelle, jedoch dauert dieser Schreibvorgang sehr, sehr lange. Hat jemand eine Idee wie man das effizienter und schneller machen kann? Habe auch schon das Forum durchgesehen, aber etwas wirklich hilfreiches noch nicht gefunden.

Hier mein Code:
Code:
fid = fopen('test.txt','wt');
for i=1:size(M,1)
    for j=1:size(M,2)
        fprintf(fid, [num2str(M(i,j)) ',']);
    end
    fprintf(fid,'\n');
end

M ist die Matrix, die Elemente in den Zeilen sollen in der Textdatei durch Beistriche getrennt sein.

Freundliche Grüße, Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Thomas K
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 08:41     Titel:
  Antworten mit Zitat      
Ich habe jetzt versucht die Schleife zu parallelisieren, bekomme aber immer die Fehlermeldung:

Error using parallel_function (line 598)

Invalid file identifier. Use fopen to generate a valid file identifier.

Error stack:
(No remote error stack)

Hier ist wieder mein Code:
Code:
matlabpool open 6

fid = fopen('S4_4_B010_neu.txt','wt');
n = size(Data,1);
m = size(Data,2);
parfor i=1:n
    for j=1:m
        fprintf(fid, [num2str(Data(i,j)) ',']);
    end
    fprintf(fid,'\n');
end
save('Data.mat','Data','-v7.3');
t = toc

matlabpool close


Kann mir jemand sagen was nicht stimmt?

Gruß, Thomas.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.07.2012, 09:08     Titel:
  Antworten mit Zitat      
Hallo,

Parallelisieren geht hier in dieser Form nicht: die Iterationen einer parfor-Schleife müssen voneinander unabhängig sein.

Was man jedoch ausnutzen sollte ist, dass fprintf vektorisiert ist.

Code:
fid = fopen('test.txt','wt');
fprintf(fid, [repmat('%f,', 1, size(M,2)) '\n'], M');
fclose(fid);


Für eine 1000x50 - Testmatrix bin ich da über 100 Mal schneller.
Bei M das Transponieren nicht vergessen!

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas K
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 10:23     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine rasche Antwort, du hast mir sehr geholfen dein Skript arbeitet sehr schnell und ist eigentlich genau das was ich gesucht habe (statt ca. 8h jetzt 150 s). Allerdings ist die Datei jetzt ungefähr 3 mal so groß (2GB), d.h. man kann sie mit dem Editor nicht mehr verarbeiten.

Vielleicht liegt das daran, dass die Einträge in der Form 1.000000 (bei einer Testmatrix mit lauter Einsen) gespeichert werden. Meine Frage ist, wie man unnötige Nachkommastellen weglassen kann?

Gruß, Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.07.2012, 10:30     Titel:
  Antworten mit Zitat      
Hallo,

da hilft die Dokumentation von FPRINTF:

%g statt %f verwenden.

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