首页 > 解决方案 > 在 for 循环中为每次迭代创建一个单独的日志文件

问题描述

我只想制作一个运行多个文件并将它们的输出存储在单独的日志文件中的脚本。

所以我通过使用来编写代码diary来生成输出,但该diary函数只有1个日志文件,并且输出在同一个日志文件中更新以进行剩余迭代。在我的testconfig_1文件中,我目前只有 print 作为内容。

然后我尝试使用该fopen方法,这样我得到了多个日志文件,但我不明白如何将这些数据放入fopen每次运行后创建的日志文件中。

% with diary method
clear all;
diary on;
instring ='testconfig_';
for x = 1:3 
fprintf ('Simulation on testconfig_%d \n' , x);
test = [instring num2str(x)];
run(test);
diary testconfig_(x).log;
end

% without diary method
clear all;
diary on;
instring ='testconfig_';
for x = 1:3
fprintf ('Simulation on testconfig_%d \n', x);
test = [instring num2str(x)];
run(test);
fid = fopen(sprintf('testconfig_%d.log',x),'w');
end

我想得到testconfig_1.log, testconfig_2.log,testconfig_3.log我想分别打印in_testconfig_1, in_testconfig_2,in_testconfig_3

标签: matlabloggingfopen

解决方案


您正在使用命令语法来调用该diary函数。

% Command syntax
diary filename.log
% Equivalent function syntax
diary( 'filename.log' );

请注意,在使用命令语法时,所有参数都被视为字符串,尽管没有任何引号!

所以当你这样做时diary testconfig_(x).log,相当于是

diary( 'diary testconfig_(x).log' );

您所有的日志都具有相同的文件名,因为x它永远不会被评估为循环变量,它始终只是字符串的一部分!

您正在尝试使用名称中的循环变量创建字符串,因此您不能使用命令语法。

相反,请使用如下函数语法:

filename = sprintf( 'diary testconfig_%d.log', x );
diary( filename ); % treat the filename variable as a variable, not a string

您不必声明中间filename变量,还有其他方法可以创建filename字符串,但我希望这能说明问题。


推荐阅读