【问题标题】:uncertain number of inputs for my function我的函数的输入数量不确定
【发布时间】:2011-03-07 02:36:43
【问题描述】:

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

有人知道最好的方法吗?

我可能不是很清楚,所以如果有什么需要澄清的,请告诉我。

谢谢

【问题讨论】:

    标签: matlab


    【解决方案1】:

    有几种方法可以解决这个问题:

    如果给定参数的含义与上下文无关,则使用可选输入参数,但如果在某些情况下需要额外的输入。

    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,了解如何处理此类输入。

    【讨论】:

    • 谢谢乔纳斯。你的想法可能会完美地解决这个问题。但我担心当 nargin 超过 10 时,它将无法保持其效率。如果我弄错了,请告诉我。再次感谢您的帮助~
    • @Tianhang:“效率”是什么意思?无论如何,如果您可以为输入设置合理的默认值,那么解决方案 #3 是最好的(如 plot 所见,您可以在其中提供数十个额外的输入)。如果您无法轻松设置默认值(或从强制输入中估计它们),这意味着您始终必须提供所有 10 个输入,无论如何,您应该使用 #1 以减少所需的输入量。
    • 好吧,我已经重新考虑了这一点,我认为实际上下文可能不需要超过 5 个输入,所以 nargin 检查就可以了。你是对的。感谢您的帮助。
    • @Tianhang:如果你觉得我的回答有用,请考虑采纳。
    【解决方案2】:

    您可以使用nargin 来验证函数的参数,因此如果您只需要一个执行某些操作,或者如果您传递更多参数执行其他操作。等等……比如:

    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
    

    这样您就可以控制接收到的参数数量。

    【讨论】:

    • 感谢您的回答。但我不太明白 nargin 与 argi 的选择有何关联。无论如何,我想我已经明白了你的想法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2021-06-05
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多