Fre*_*ick 6 matlab printf verbosity clarity
假设我有some_fun做了一些复杂的工作.
function foo = some_complicated_fun(x,y,z,verbosity)
Run Code Online (Sandbox Code Playgroud)
我已经在这段代码中编写了很多调试打印件,但是avg用户可能没有兴趣看到它是否正常工作.无论如何都会打印错误语句(不够args等).
我目前编写函数的方法是:
function foo = some_complicated_fun(x,y,z,verbosity)
(x,y,z,verbosity) = parse_args(x,y,z,verbosity); % parse args, check nargin, etc
for i=1:5,
% whatever
% do some work with x,y,z
% blah blah
if verbosity
fprintf('Now on iteration %i\n',i); % basic print
end
% or, with mutiple levels:
if verbosity == 1;
fprintf('Now on iteration %i\n',i); % basic print
end
if verbosity == 2;
fprintf('x = %f,y = %f,z=%f %i\n',x,y,z); % more information
end
% do more work
end
Run Code Online (Sandbox Code Playgroud)
我不喜欢用if语句来做它,因为它使代码混乱,但我想不出任何其他方式.一个班轮越来越好:
if verbosity; fprintf('Iteration %i\n',i); end
Run Code Online (Sandbox Code Playgroud)
更好,因为它更小,更糟糕,因为单行不可读性比3行更相同.
我想要的是一些控制冗长的简单,更优雅的方法.
那存在吗?
我创建了一种控制日志输出详细程度的方法。还没有完成,但自从这个问题出现后,我将其上传到:
它的工作原理是将全局输出日志设置为所需的级别,并将按以下格式显示消息:
OUTPUT_LEVEL: function_which_called_message Your_Message.
Run Code Online (Sandbox Code Playgroud)
但是,它只会输出高于您设置的输出级别的消息。默认情况下仅显示 INFO 消息或更高级别的消息,因此不会显示 DEBUG 和 VERBOSE 消息。如果你想查看调试消息,那么你设置:
Output.level(Output.DISP_DEBUG)
Run Code Online (Sandbox Code Playgroud)
输出方法有:
Output.VERBOSE
Output.DEBUG
Output.INFO
Output.WARNING
Output.ERROR
Run Code Online (Sandbox Code Playgroud)
Output.'DESIRED_LEVEL'('message',input_1,input2)您可以按照sprintf或matlab 格式执行操作来选择要在函数中显示的消息fprintf。IE,Output.INFO('The variable value is %d',variable)。对于警告和错误消息,您还可以指定标识符,如“PACKAGE:METHOD:ERROR_ID”,这样,输出将在 matlabwarning和error函数上。IE Output.WARNING('MY_PACKAGE:MY_METHOD:MY_ID','Something wrong happened here!')。
可用的输出电平有:
Output.level(Output.DISP_VERBOSE) % Show all messages
Output.level(Output.DISP_DEBUG) % Show debug info warning errors
Output.level(Output.DISP_INFO) % Show info warning errors
Output.level(Output.DISP_WARNING) % Show warning errors
Output.level(Output.DISP_MUTE) % Show only errors.
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下命令指定输出到日志文件
Output.place('file_path')
Run Code Online (Sandbox Code Playgroud)
并替换日志文件(您也可以使用它来重置当前日志):
Output.place('file_path',true)
Run Code Online (Sandbox Code Playgroud)
或者将其重置为屏幕
Output.place(1)
Run Code Online (Sandbox Code Playgroud)
以下是使用输出级别 DISP_VERBOSE 的输出示例:
>> nilmContainer = NilmFileContainer.newRun('inputFolder','sim_real/','runName','RealHouse','samplesPerFile',60*60*60);
VERBOSE: getFilesOnFolder Found 2 files on folder 'data/sim_real/'. They are the following:
VERBOSE: getFilesOnFolder [1]:data/sim_real/240AM000.csv
VERBOSE: getFilesOnFolder [2]:data/sim_real/240AM001.csv
DEBUG: NilmFileContainer.setRunName Updating run name to RealHouse_Run5.
INFO: newRun Reading file data/sim_real/240AM000.csv.
VERBOSE: csv_data Reading samples (Ignored:0,Read:216000,Remaining:2422014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_1-19:12:46-30_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:216000,Read:216000,Remaining:2206014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_2-20:12:45-30_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:432000,Read:216000,Remaining:1990014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_3-21:12:45-30_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:648000,Read:216000,Remaining:1774014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_4-22:12:45-30_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:864000,Read:216000,Remaining:1558014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_5-23:12:45-30_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:1080000,Read:216000,Remaining:1342014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_6-00:12:44-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:1296000,Read:216000,Remaining:1126014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_7-01:12:43-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:1512000,Read:216000,Remaining:910014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_8-02:12:43-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:1728000,Read:216000,Remaining:694014) at file: sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_9-03:12:43-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:1944000,Read:216000,Remaining:478014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_10-04:12:42-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:2160000,Read:216000,Remaining:262014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_11-05:12:41-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:2376000,Read:216000,Remaining:46014) at file: data/sim_real/240AM000.csv.
DEBUG: addFiles Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_12-06:12:41-31_10_2012.mat'
VERBOSE: csv_data Reading samples (Ignored:2592000,Read:46014,Remaining:0) at file: data/sim_real/240AM000.csv.
VERBOSE: csv_data Reading samples (Ignored:0,Read:169986,Remaining:2799058) at file: data/sim_real/240AM001.csv.
INFO: readFile Found discontinuity while changing from file 'data/sim_real/240AM000.csv' to 'data/sim_real/240AM001.csv'.
Run Code Online (Sandbox Code Playgroud)
正如我所说,它还不是最终版本,但你可以帮助我改进它!X)