Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控制matlab函数中冗长的想法/最佳实践_Matlab_Printf_Verbosity_Clarity - Fatal编程技术网

控制matlab函数中冗长的想法/最佳实践

控制matlab函数中冗长的想法/最佳实践,matlab,printf,verbosity,clarity,Matlab,Printf,Verbosity,Clarity,比如说,我有一些乐趣,做一些复杂的工作 function foo = some_complicated_fun(x,y,z,verbosity) 我已经在这段代码中编写了一些调试打印,但是avg用户可能不想看到它是否正常工作。 不管怎样,都将打印错误语句(没有足够的参数等) 我目前编写函数的方法是: function foo = some_complicated_fun(x,y,z,verbosity) (x,y,z,verbosity) = parse_args(x,y,z,verbosi

比如说,我有一些乐趣,做一些复杂的工作

function foo = some_complicated_fun(x,y,z,verbosity)
我已经在这段代码中编写了一些调试打印,但是avg用户可能不想看到它是否正常工作。 不管怎样,都将打印错误语句(没有足够的参数等)

我目前编写函数的方法是:

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
我不喜欢使用if语句,因为它会把代码弄得乱七八糟,但我想不出其他方法。 一个班轮是好是坏:

if verbosity; fprintf('Iteration %i\n',i); end
更好的是因为它更小,更糟糕的是,一行代码的可读性比三行代码的可读性差

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


是否存在?

定义一个函数来替换
fprintf
,该函数包含
if
语句和实际打印。并将
verbosity
声明为
global
变量,以避免每次都将其作为参数传递。

这就是我最后要做的

我编写了一个函数(我称之为vprintf,但还有更好的名称)

我不确定我想做全局变量,但这是一个想法

function vprintf(v,l,varargin)
% VPRINTF(verbosity, verbosity_level_of_statement,sprintf_style_arguments
% 
% 
% example: 
% 
% verbosity = 1;
% vprintf(verbosity,1,'This will print if verbosity is at least 1\n Verbosity = %i\n',verbosity);

if nargin<3
    error('not enough arguments');
end
if v>=l % if verbosity level is >= level of this statment
%     keyboard;
    fprintf(varargin{:});
end
函数vprintf(v,l,varargin)
%VPRINTF(冗余度、冗余度、语句级别、sprintf样式参数
% 
% 
%例如:
% 
%冗长=1;
%vprintf(详细度,1,'如果详细度至少为1\n详细度=%i\n',详细度,则此选项将打印);
如果nargin=l%,如果详细程度大于等于此声明的级别
%键盘;
fprintf(varargin{:});
结束

作为对Frederick和Luis Mendo答案的改进,您可以在函数末尾将
vprintf
函数定义为a。它可以访问参数
详细程度
,您不需要全局变量。您的代码如下所示:

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

    vprintf(1,'Now on iteration %i\n',i); % basic print

    % or, with mutiple levels:
    vprintf(1,'Now on iteration %i\n',i); % basic print
    vprintf(2,'x = %f,y = %f,z=%f %i\n',x,y,z); % more information

    % do more work
end

    % time to define vprintf
    function vprintf(l,varargin)
    % VPRINTF(verbosity, verbosity_level_of_statement,sprintf_style_arguments
    % 
    % 
    % example: 
    % 
    % verbosity = 1;
    % vprintf(1,'This will print if verbosity is at least 1\n Verbosity = %i\n',verbosity);

    if nargin<2
        error('not enough arguments');
    end
    if verbosity>=l % if verbosity level is >= level of this statment
    %     keyboard;
        fprintf(varargin{:});
    end
end
%% my fancy script
% init
logger = Logger(Logger.LOGDEBUG)
logger.logDebug('script initialized');

% plot some stuff
logger.logDebug('commencing plot');
plot(rand(4));
logger.logInfo('fancy script ended');
然后在
foo
函数中,在开头设置它,并在后面的语句中使用它。通过
vprintf([]);


如果我想这样做,我会创建一个Logger类,类似于使用诸如
logDebug
logInfo
logWarning
logError
之类的函数(实际上我已经为lua完成了这项工作)

您必须在创建时设置loglevel,并且可以在Logger对象的范围内访问完整的功能和函数(因此没有全局范围污染,并且可以在多个m文件中轻松实现)

所以这个类的最终用法如下所示:

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

    vprintf(1,'Now on iteration %i\n',i); % basic print

    % or, with mutiple levels:
    vprintf(1,'Now on iteration %i\n',i); % basic print
    vprintf(2,'x = %f,y = %f,z=%f %i\n',x,y,z); % more information

    % do more work
end

    % time to define vprintf
    function vprintf(l,varargin)
    % VPRINTF(verbosity, verbosity_level_of_statement,sprintf_style_arguments
    % 
    % 
    % example: 
    % 
    % verbosity = 1;
    % vprintf(1,'This will print if verbosity is at least 1\n Verbosity = %i\n',verbosity);

    if nargin<2
        error('not enough arguments');
    end
    if verbosity>=l % if verbosity level is >= level of this statment
    %     keyboard;
        fprintf(varargin{:});
    end
end
%% my fancy script
% init
logger = Logger(Logger.LOGDEBUG)
logger.logDebug('script initialized');

% plot some stuff
logger.logDebug('commencing plot');
plot(rand(4));
logger.logInfo('fancy script ended');

我已经创建了一个控制日志输出详细性的方法。该方法尚未完成,但由于出现了此问题,我将其上载到:

它通过将全局输出日志设置为所需级别来工作,并将以以下格式显示消息:

OUTPUT_LEVEL:  function_which_called_message       Your_Message.
但是,它将只输出高于您设置的输出级别的消息。默认设置为仅显示信息消息或更高级别的消息,因此它不会显示调试消息和详细消息。如果要查看调试消息,请设置:

Output.level(Output.DISP_DEBUG)
输出方法为:

Output.VERBOSE
Output.DEBUG
Output.INFO
Output.WARNING
Output.ERROR 
通过执行
Output.'DESIRED_LEVEL'('message',input_1,input2)
选择要在函数中显示的消息,如
sprintf
fprintf
matlab格式。即,
Output.INFO('变量值为%d',变量)
。对于警告和错误消息,您还可以将标识符指定为'PACKAGE:METHOD:ERROR\u ID',这样做,输出将在matlab的
WARNING
ERROR
函数上。即
output.WARNING('MY\u PACKAGE:MY\u METHOD:MY\u ID','Something missed 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.
还可以使用指定日志文件的输出

Output.place('file_path')
和替换日志文件(您也可以使用它重置当前日志):

或者将其重置为屏幕

Output.place(1)
下面是使用输出级别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'.

正如我所说,它不是最终版本,但是你可以帮助我改进它!x)

但是你必须将它复制到你使用的每一个函数中,这将是一件痛苦的事情,特别是如果你决定更改该函数中的某些内容function@GuntherStruyf没错。取决于此构造在整个代码库中的流行程度。我添加了另一个使用持久变量而不是全局变量的解决方案。
>> 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'.