控制matlab函数中详细程度的想法/最佳实践

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行更相同.

我想要的是一些控制冗长的简单,更优雅的方法.

那存在吗?

Wer*_*ner 1

我创建了一种控制日志输出详细程度的方法。还没有完成,但自从这个问题出现后,我将其上传到:

此链接位于 Matlab 文件交换。

它的工作原理是将全局输出日志设置为所需的级别,并将按以下格式显示消息:

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”,这样,输出将在 matlabwarningerror函数上。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)