Matlab函数的可选输入参数

时间:2016-03-08 23:41:16

标签: matlab

我需要实现一个函数,对位于文件夹(folder1)中的特定数量的图像(nFrame)执行一些图像处理。该函数看起来像:

function imgProc( nFrames,path )

假设我有几个文件夹,每个文件夹中包含不同数量的图像。我需要的是可选的输入参数,这意味着如果用户想要,他可以对前10个图像进行图像处理,但是如果他没有指定数字,那么该函数应该在所有的上执行任务。图片。对于文件夹也是如此,如果用户没有指定他想要从哪个文件夹中获取图像,则应该有一个默认文件夹。用户可以使用0,1或2个输入参数调用该函数也很有趣。

我想过使用这样的exist函数:

function imgProc( nFrames,path )

if exist( path,'var' ) == 0
    path = 'img/record_space';
end

if exist( nFrames,'var' ) == 0
    d = dir([ path,'\*.png' ]);
    nFrames = length( d( not([ d.isdir ]) ) );
end

end

但是如果我在没有输入参数的情况下调用该函数,则会给出一个错误,指出没有足够的输入参数。 是否可以创建一个可以使其所有参数都可选的函数,并且允许您根据需要输入0,1或2,同时考虑到一个是数字而另一个是字符串?

1 个答案:

答案 0 :(得分:4)

要解决代码中的问题:

function imgProc( nFrames,path )

if exist( 'path','var' ) == 0
    path = 'img/record_space';
end

if exist( 'nFrames','var' ) == 0
    d = dir([ path,'\*.png' ]);
    nFrames = length( d( not([ d.isdir ]) ) );
end

end

exists期望变量名称,而不是变量本身。您可以传递包含字符串的变量,但它会检查该字符串是否存在:

x='y'
exist(x,'var') % checks if y exists
exist('x','var') %checks if x exists

我建议使用inputParser

来建立灵活的界面
function imgProc( varargin )
p = inputParser;
addOptional(p,'frames',inf,@isnumeric);
addOptional(p,'path',pwd,@(x)exist(x,'dir'));
parse(p,varargin{:});
%lower frames if required to the maximum possible value
frames=min(p.Results.frames,numel(dir(fullfile(p.Results.path,'*.png'))));
%if frame was previously a number (not inf) and is lowered, print a warning.
if frames<p.Results.frames&&p.Results.frames~=inf
    warning('parameter frames exceeded number of images present. Frames set to %d',frames);
end
disp(p.Results);
end

调用该函数的可能方法:

>> imgProc
    frames: Inf
      path: 'D:\Documents\MATLAB'

>> imgProc('frames',1)
    frames: 1
      path: 'D:\Documents\MATLAB'

>> imgProc('path','foo')
    frames: Inf
      path: 'foo'

>> imgProc('path','bar','frames',9)
    frames: 9
      path: 'bar'