Verfasst am: 12.09.2009, 12:44
Titel: Problem mit .txt-Datei Output in Schleife mit fprintf
Hallo,
ich habe ein Problem mit fprintf. Im Zuge meiner Diplomarbeit benutze ich für eine nichtlineare Optimierung die Optimierungsroutine fminserachbnd und lasse mir in jedem Iterationsschritt einen Output durch die unten dargestellte Outputdatei "output_gamma_sigma_8" erstellen und mit Hilfe von fprintf in eine .txt Datei exportieren.
Code:
function stop = output_gamma_sigma_8(EstVec, optimValues, state) %#ok<INUSL>
stop = false;
fid = fopen('Simch_gamma_sigma_21.txt', 'at'); % protokollieren switch state %#ok<ALIGN>
case 'init'
fprintf(fid,'Iter \t F-count \t f(x) \t Max constr. \t Line search stepl. \t Direc. der. \t 1st-ord. opt. \t Procedure \t Time \n \n');
case 'iter'
Zeit = clock;
fid = fopen('Simch_gamma_sigma_21.txt', 'at'); % protokollieren fprintf(fid, '%6g \t %6g \t %6.4f \t %s \t \t %02g.%02g.%04g, %02g:%02g:%02.0f Uhr \n', ...
optimValues.iteration, optimValues.funccount, optimValues.fval,optimValues.procedure, ...
Zeit(3), Zeit(2), Zeit(1), Zeit(4), Zeit(5), Zeit(6));
case 'done'
fclose(fid);
hold off
otherwise end end
Egal was ich mache, jedesmal nach 418 optimValues.iteration Iterationen, also bevor die 419. Iteration geschrieben werden kann, und einer .txt Dateigröße von exakt 30KB bricht die Optimierung mit der Fehlermeldung:
Code:
Aktueller ML-Funktionswert: 4512.35 419663-4512.35 reflect
??? Error using ==> fprintf
Invalid file identifier. Usefopen to generate a valid file identifier.
Ich bin mir nicht sicher, ob es ein Limit für mit FOPEN / FPRINTF erzeugten Dateien gibt. Aber ween es enes gibt, ist es gewiss nicht bei 30kb. Ich habe schon mal davon gehört, dass Anwender mit dem "append" Modus Schwierigkeiten haben. Da in dem Beispielcode nichts angehängt wird schlage ich for nur mit "write" zu öffnen.
Hallo, ich stimme Andreas zu, Größe kann es nicht sein.
Nach rumprobieren, habe ich dein Fehler reproduziert:
Du erzeugt in jeder Iteration ständig neuen File-Identifier und machst diesen nie wieder zu. Das führt dazu dass der Topf mit Identifiern ausgeschöpft wird.
Andreas denke kann es besser erklären, oder kennt den Link zu Mathworks-Seite.
mach es doch anders:
Vor SWITCH öffne den FILE
Nach SWITCH schließe es wieder:
Code:
function stop = output_gamma_sigma_8(EstVec, optimValues, state) %#ok<INUSL>
stop = false;
fid = fopen('Simch_gamma_sigma_21.txt', 'at'); % protokollieren switch state %#ok<ALIGN>
case 'init'
fprintf(fid,'Iter \t F-count \t f(x) \t Max constr. \t Line search stepl. \t Direc. der. \t 1st-ord. opt. \t Procedure \t Time \n \n');
case 'iter'
Zeit = clock;
fprintf(fid, '%6g \t %6g \t %6.4f \t %s \t \t %02g.%02g.%04g, %02g:%02g:%02.0f Uhr \n', ...
optimValues.iteration, optimValues.funccount, optimValues.fval,optimValues.procedure, ...
Zeit(3), Zeit(2), Zeit(1), Zeit(4), Zeit(5), Zeit(6));
otherwise end fclose(fid);
end
PS: Baue dir doch eine test-script um schnell zu schauen ob es funktion ordnungsgemäß funktioniert
Code:
output_gamma_sigma_8([], [], 'init')
for i=1:1000
optimValues.iteration=i;
optimValues.funccount=i;
optimValues.fval=i;
optimValues.procedure='test';
output_gamma_sigma_8([], optimValues, 'iter') end
Herzlichen Dank!
Hat natürlich funktioniert. Da hätte ich auch selbst drauf kommen müssen.
Super!
Einstellungen und Berechtigungen
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
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.