2011-03-07 75 views
2

我最近遇到了一个问题,那就是我应该定义一个输入数量不确定的函数,也就是说,根据实际情况,输入数量可能会有所不同。我应该使用二维数组还是其他?我不知道struct2cell是否有用,以及它是否真的有效。函数的输入数量不确定

有没有人有这样做的最好方法的想法?

我可能不是很清楚,所以请让我知道是否需要澄清任何事情。

感谢

回答

6

有几种方法去这个问题:

使用可选的输入参数,如果给定参数的含义,无论背景相同,但如果在某些情况下,需要额外的投入。

function out = myFun(first,second,third,fourth) 

%# first is always needed 
if nargin < 1 || isempty(first) 
error('need nonempty first input') 
end 

%# second is optional 
if nargin < 2 || isempty(second) 
second = defaultValueForSecondWhichCanBeEmpty; 
end 

%# etc 

您可以将此函数调用为out = myFun(1,[],2,3),即为非必需的输入传递一个空数组。


如果两个输入意味着该函数用于一种方式,和三个输入意味着该功能以另一种方式使用(甚至投入意味着不同的事情),使用VARARGIN

function out = myFun(varargin) 

%# if 2 inputs, it's scenario 1, with 3 it's scenario 2 
switch nargin 
case 2 
    firstParameter = varargin{1}; 
    secondParameter = varargin{2}; 
    scenario = 1; 
case 3 
    firstParameter = varargin{1}; %# etc 
otherwise 
    error('myFun is only defined for two or three inputs') 
end 

最后,您还可以将您的输入作为parameterName/parameterValue对传递。有关如何处理此类输入的信息,请参阅this question

+0

谢谢乔纳斯。你的想法可以完美地处理这个问题。但是,如果我们的报道大于10,那么恐怕它将无法保持其效率。请让我知道是否我错了。再次,我真的很感谢你的帮助〜 – Tianhang 2011-03-08 01:37:18

+0

@天行:你说的“效率”是什么意思?无论如何,如果您可以为输入设置合理的默认值,那么解决方案#3是最好的(例如,对于“plot”,您可以提供数十个附加输入)。如果您不能轻松设置默认值(或从强制性输入中估计它们),这意味着您必须始终输入所有10个输入,无论如何,您应该使用#1来减少所需的输入量。 – Jonas 2011-03-08 02:12:14

+0

好吧,我已经重新考虑了这一点,我认为实际的背景可能不需要超过5个输入,所以简单检查就可以完成。你是对的。谢谢你的帮助。 – Tianhang 2011-03-08 07:09:38

1

您可以使用nargin的参数验证你的函数,所以如果你只需要一个做一些动作,或者如果TOU传递的参数做一些其他的动作。如:

function yours(arg1,arg2,arg3,arg4,arg5,...,argn) 
    if nargin < 5 
    arg5 = 'Init' 
    elseif (nargin > 1) 
    arg2 = 'Init' 
    arg3 = 'Init' 
    arg4 = 'Init' 
    arg5 = 'Init' 
    end 
end 

所以你可以控制你收到的参数数量。

+0

感谢您的回答。但我不太明白,如何选择argi的叙述。无论如何,我想我已经有了你的想法。谢谢。 – Tianhang 2011-03-08 07:13:36