Ist es möglich, den 'n-ten' Rückgabewert von einer Funktion abzurufen, ohne vorher Dummy-Variablen für alle n-1
Rückgabewerte erstellen zu müssen ?
Angenommen, ich habe die folgende Funktion in MATLAB:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Angenommen, ich interessiere mich nur für den dritten Rückgabewert. Dies kann durch Erstellen einer Dummy-Variablen erreicht werden:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Aber ich finde das irgendwie hässlich . Ich würde denken, dass Sie in der Lage sein könnten, so etwas wie eines der folgenden Dinge zu tun, aber Sie können nicht:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
Gibt es elegante Möglichkeiten, dies zu tun, die funktionieren?
Bisher besteht die beste Lösung darin, die variableThatIWillUse
Variable einfach als Dummy-Variable zu verwenden. Dies erspart mir die Erstellung einer echten Dummy-Variablen, die den Arbeitsbereich verschmutzt (oder die ich löschen müsste). Kurz gesagt: Die Lösung besteht darin, den variableThatIWillUse
Wert für jeden Rückgabewert bis zum interessanten zu verwenden. Rückgabewerte nach können einfach ignoriert werden:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Ich denke immer noch, dass dies ein sehr hässlicher Code ist, aber wenn es keinen besseren Weg gibt, werde ich die Antwort wahrscheinlich akzeptieren.
quelle
Antworten:
Dies ist ein bisschen wie ein Hack, aber es funktioniert:
Zunächst eine kurze Beispielfunktion:
Der Schlüssel hier ist nun, dass, wenn Sie eine Variable auf der linken Seite einer Zuweisung mit mehreren Ausdrücken zweimal verwenden , eine frühere Zuweisung durch die spätere Zuweisung beeinträchtigt wird:
(Bearbeiten: Nur um zu überprüfen, habe ich auch überprüft, ob diese Technik funktioniert,
[mu,mu,mu]=polyfit(x,y,n)
wenn alles, was Sie interessiert,polyfit
das dritte Argument ist.)edit: es gibt einen besseren Ansatz; Siehe stattdessen die Antwort von ManWithSleeve .
quelle
Mit MATLAB Version 7.9 (R2009b) können Sie ein ~ verwenden, z.
Beachten Sie, dass das
,
nicht optional ist. Nur das Tippen[~ ~ var]
funktioniert nicht und wirft einen Fehler auf.Weitere Informationen finden Sie in den Versionshinweisen.
quelle
not
Operators wie in auchdon't care
nicht so schlecht ist,
nicht optional ist. Einfach mit der Eingabe[~ ~ var]
wird nicht arbeiten, und wird einen Fehler werfen.Wenn Sie einen Stil verwenden möchten, bei dem eine Variable in den Bit-Bucket fällt, ist dies eine sinnvolle Alternative
ans ist natürlich die Standard-Junk-Variable für matlab, die im Verlauf einer Sitzung häufig überschrieben wird.
Ich mag zwar den neuen Trick, den MATLAB jetzt zulässt, indem ein ~ verwendet wird, um eine ignorierte Rückgabevariable zu kennzeichnen, dies ist jedoch ein Problem für die Abwärtskompatibilität, da Benutzer älterer Versionen Ihren Code nicht verwenden können. Ich vermeide es im Allgemeinen, solche neuen Dinge zu verwenden, bis mindestens einige MATLAB-Versionen veröffentlicht wurden, um sicherzustellen, dass nur noch sehr wenige Benutzer im Stich gelassen werden. Zum Beispiel finde ich, dass die Leute auch jetzt noch eine MATLAB-Version verwenden, die alt genug ist, um keine anonymen Funktionen verwenden zu können.
quelle
Hier ist eine weitere Option, die Sie verwenden können. Erstellen Sie zunächst ein Zellenarray, um alle Ausgaben zu erfassen (Sie können die NARGOUT- Funktion verwenden, um zu bestimmen, wie viele Ausgaben eine bestimmte Funktion zurückgibt):
Rufen Sie dann die Funktion wie folgt auf:
Dann entfernen Sie einfach das Element aus einem , dass Sie möchten, und überschreiben ein :
quelle
Ich habe eine k-te Funktion geschrieben:
Sie können dann anrufen
Sie können die Funktion auch wie folgt abschließen
Danach verwenden Sie
Beachten Sie, dass mit der Verwendung anonymer Funktionen wie dieser Overhead verbunden ist, und dies würde ich nicht in Code tun, der tausende Male aufgerufen wird.
quelle
In Matlab 2010a habe ich eine gute Möglichkeit gefunden, das zu tun, wonach Sie fragen. Es ist einfach, das Zeichen "~" (natürlich ohne Anführungszeichen) als Dummy-Variable zu verwenden (so viele, wie Sie möchten, wenn Sie mehrere Parameter zurückgeben). Dies funktioniert auch für Eingabeparameter für Funktionen, wenn die Funktionen für die Verarbeitung fehlender Daten ausgelegt sind. Ich weiß nicht, ob dies in früheren Versionen vorhanden war, aber ich bin erst kürzlich darauf gestoßen.
quelle
Sie können eine Funktion (oder eine anonyme Funktion) erstellen, die nur ausgewählte Ausgaben zurückgibt, z
Dann können Sie Ihre Funktion folgendermaßen aufrufen:
Oder Sie können die Ausgabe einer Variablen zuweisen:
quelle
decimatedfftx = select(fft(x,12),1:4:12);
select(func,2)
Anrufefunc(2)
. Ich sehe nicht, wo dies Ausgabeargumente auswählt.Gibt es einen Grund, ans (n) nicht wie folgt zu verwenden:
Gibt b = 10 und wäre dieser Weg nicht mit allen Matlab-Versionen kompatibel?
Außerdem funktioniert dies, um das zweite Ausgabeargument zu erhalten, wenn Sie nicht wissen, wie viele Argumente es geben wird! Wenn Sie dies tun:
Dann ist b = 8000! (Sie müssen mit ~ enden, um mehr Argumente zu fangen!)
quelle
size(a)
und[b,c]=size(a)
verschiedene Dinge zurückgeben. Funktionen in MATLAB ändern das Verhalten basierend auf der Anzahl der Ausgabeargumente.