2016-05-14 9 views
0

Ich frage mich, ob es möglich ist, Ausgangsargumente einer Funktion zur Laufzeit als Aufrufer anzugeben? So kann beispielsweise die Funktion ‚ind2sub‘ return N Ausgänge conresponding N Subskripte wenn mit einem 1 durch N-Vektor in dem ersten Eingang Argumente aufgerufen, wie untenIst es möglich, Ausgabeargumente zur Laufzeit dynamisch anzugeben

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

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

Dieser zwei Anruf dem linearen Index 5 auf eine 2 umwandelt -d-Indizes [2,2] bzw. 3-d-Indizes [2,2,1].

Was ich fragen ist, können wir die Ausgabeargumente zur Laufzeit angeben, wenn wir 'ind2sub' aufrufen, ohne zu wissen, was genau der erste Parameter ist? Oder was machst du normalerweise, um mit dieser Situation umzugehen, in der du nicht im Voraus weißt, wie viele Ausgaben du bekommen wirst?

Antwort

1

Sie müssen varargout verwenden, um dies zu erreichen. varargout ist ein Zellenarray (das Sie mit Ihren Ausgangsargumenten füllen) und Sie setzen varargout anstelle von traditionellen Ausgangsargumenten für Ihre Funktion. Wie viele Ausgabeargumente bereitgestellt werden, hängt jedoch von vielen Elementen ab, die Sie in varargout platzieren.

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 

Sie können nargout verwenden, wenn Sie feststellen möchten, wie viele Ausgabeargumente der Benutzer aufgefordert.

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 

aktualisieren

Wenn Sie variable Ausgangs Argumente auf der rufenden Seite benötigen, können Sie eine Zellenanordnung für das auch nutzen und sich auf Zellenfelderweiterung mit {:} in allen Werten zu füllen.

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

Oder wenn Sie nicht wissen, die Anzahl der Ausgänge (dies funktioniert nur, wenn Sie nicht varargout in der Funktion verwenden Sie).

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

Für Ihre spezifischen Beispiele mit ind2sub, könnten Sie so etwas wie zu tun.

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

Oh, ich denke, ich irre dich. Ich meine eigentlich, wie wir verschiedene Ausgaben als Anrufer spezifizieren können, nicht als Angerufener. – bridger

+0

@Hua Mit einem Beispiel aktualisiert. – Suever

+0

Oh, ich kenne diese Technik nicht, ich werde es versuchen. Danke für diesen Tipp! – bridger

Verwandte Themen