2011-03-07 56 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