2016-05-14 9 views
0

実行時に関数の出力引数を呼び出し側として指定できるかどうか疑問に思っていますか?最初の入力引数にNベクトルによって1で呼び出された場合実行時に出力引数を動的に指定することは可能ですか?

[row,col]=ind2sub([3,2],5) 

[row,col,dep]=ind2sub([3,2,3],5) 

以下は、この2つのコールが線形インデックス5は2に変換するように、例えば、関数「ind2sub」は、N個の添字をconresponding N個の出力を返すことができ-dの添え字[2,2]と3-dの添え字[2,2,1]である。

実行時に出力引数を指定することができます。最初のパラメータが正確にわからずに 'ind2sub'を呼び出すと、出力引数を指定できますか?または、あなたが得る出力をあらかじめ知っていないこのような状況に対処するために、通常何をしていますか?

答えて

1

これを行うには、varargoutを使用する必要があります。 varargoutはセル配列です(出力引数で入力します)、関数の伝統的な出力引数の代わりにvarargoutを置きます。しかし、多くの項目がvarargoutにあると、出力引数の数が決まります。

function varargout = functionName(nOutputs) 
    if nOutputs == 1 
     varargout{1} = [1,2]; 
    else 
     varargout = {1,2}; 
    end 
end 

functionName(1) 
%// 1 2 

[a, b] = functionName(2) 
%// a = 1 
%// b = 2 

ユーザーが要求したどのように多くの出力引数を決定したい場合は、nargoutを使用することができます。

function varargout = functionName() 
    if nargout == 1 
     varargout = {[1, 2, 3]}; 
    elseif nargout == 2 
     varargout = {1, [2, 3]}; 
    else 
     varargout = {1, 2, 3}; 
    end 
end 

functionName() 
%// 1 2 3 

[a,b] = functionName() 
%// a = 1 
%// b = [2, 3] 

[a,b,c] = functionName() 
%// a = 1 
%// b = 2 
%// c = 3 

更新

あなたは、呼び出し側の変数出力引数が必要な場合は、同様にそのためのセル配列を使用して、すべての値を埋めるために{:}とセルアレイの拡張に依存することができます。

nOutputs = 2; 
output = cell(nOutputs, 1); 
[output{:}] = functionName(); 
%// {1, [2, 3]} 

それとも、出力数を(あなたが機能でvarargoutを使用していない場合にのみ動作します)わからない場合。

outputs = cell(nargout('functionName'), 1); 
[outputs{:}] = functionName(); 

具体例をind2subとすると、次のようになります。

sz = [3, 2, 3]; 
outputs = cell(size(sz)); 
[outputs{:}] = ind2sub(sz, 5); 
+0

ああ、私はあなたを誤解していると思います。私は実際には、呼び出し元としてさまざまな出力を指定する方法を意味し、呼び出し先として指定することはできません。 – bridger

+0

@Hua例を更新しました。 – Suever

+0

ああ私はこの技術に精通していない、私はそれを試してみましょう。このヒントをありがとう! – bridger

関連する問題