作为对 Frederick 和 Luis Mendo 答案的改进,您可以在函数末尾将函数定义vprintf
为嵌套函数。它将可以访问参数verbosity
,并且您不需要全局变量。您的代码如下所示:
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
编辑
为了克服Gunther Struyf 在评论中提到的可维护性问题,您可以将verbosity
值保留在持久变量中vprintf
并在第一次调用中设置它。
function vprintf(vl,varargin)
% VPRINTF(verbosity);
% VPRINTF(verbosity_level_of_statement,sprintf_style_arguments);
persistent verbosity
if nargin==1
verbosity = vl;
elseif isempty(verbosity)
error('verbosity level not set');
end
if verbosity>=vl % if verbosity level is >= level of this statment
% keyboard;
fprintf(varargin{:});
end
然后在foo
函数的开头设置它并在后面的语句中使用它。清除退出中的价值可能是一个好习惯vprintf([]);
function foo = some_complicated_fun(x,y,z,verbosity)
[x,y,z,verbosity] = parse_args(x,y,z,verbosity); % parse args, check nargin, etc
vprintf(verbosity);
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
vprintf([]);