Est-il possible d'obtenir la «nième» valeur de retour d'une fonction sans avoir à créer des variables fictives pour toutes les n-1
valeurs de retour avant elle?
Disons que j'ai la fonction suivante dans MATLAB:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Supposons maintenant que je ne m'intéresse qu'à la troisième valeur de retour. Cela peut être accompli en créant une variable factice:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Mais je pense que c'est un peu moche . Je pense que vous pourriez faire quelque chose comme l'une des choses suivantes, mais vous ne pouvez pas:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
Y a-t-il des façons élégantes de faire cela qui fonctionnent?
Jusqu'à présent, la meilleure solution consiste simplement à utiliser le variableThatIWillUse
comme variable factice. Cela m'évite d'avoir à créer une vraie variable factice qui pollue l'espace de travail (ou que j'aurais besoin d'effacer). En bref: la solution est d'utiliser le variableThatIWillUse
pour chaque valeur de retour jusqu'à l'intéressante. Les valeurs renvoyées après peuvent simplement être ignorées:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Je pense toujours que c'est un code très laid, mais s'il n'y a pas de meilleur moyen, je suppose que j'accepterai la réponse.
la source
Réponses:
C'est un peu un hack mais cela fonctionne:
Tout d'abord un exemple de fonction rapide:
Maintenant, la clé ici est que si vous utilisez une variable deux fois dans la partie gauche d'une affectation à expressions multiples, une affectation antérieure est écrasée par l'affectation ultérieure:
(modifier: juste pour vérifier, j'ai également vérifié que cette technique fonctionne
[mu,mu,mu]=polyfit(x,y,n)
si tout ce qui vous importepolyfit
est le 3ème argument)edit: il y a une meilleure approche; voir plutôt la réponse de ManWithSleeve .
la source
Avec MATLAB version 7.9 (R2009b), vous pouvez utiliser un ~, par exemple,
Notez que le
,
n'est pas facultatif. Le simple fait de taper[~ ~ var]
ne fonctionnera pas et générera une erreur.Consultez les notes de version pour plus de détails.
la source
not
opérateur comme dansdon't care
ne soit pas si mal non plus,
n'est pas facultatif. Il suffit de taper[~ ~ var]
sera pas le travail, et sera une erreur.Si vous souhaitez utiliser un style dans lequel une variable sera laissée tomber dans le seau de bits, une alternative raisonnable est
ans est bien sûr la variable indésirable par défaut pour matlab, qui est souvent écrasée au cours d'une session.
Bien que j'aime la nouvelle astuce que MATLAB permet maintenant, en utilisant un ~ pour désigner une variable de retour ignorée, c'est un problème de compatibilité descendante, en ce sens que les utilisateurs d'anciennes versions ne pourront pas utiliser votre code. J'évite généralement d'utiliser de nouvelles choses comme ça jusqu'à ce qu'au moins quelques versions de MATLAB aient été publiées pour m'assurer qu'il restera très peu d'utilisateurs dans l'embarras. Par exemple, même maintenant, je trouve que les gens utilisent toujours une version MATLAB suffisamment ancienne pour qu'ils ne puissent pas utiliser de fonctions anonymes.
la source
Voici une autre option que vous pouvez utiliser. Créez d' abord un tableau de cellules pour capturer toutes les sorties (vous pouvez utiliser la fonction NARGOUT pour déterminer le nombre de sorties renvoyées par une fonction donnée):
Appelez ensuite la fonction comme suit:
Ensuite, supprimez simplement l'élément de a que vous voulez et écrasez a :
la source
J'ai écrit une fonction kth out:
vous pouvez alors appeler
vous pouvez également terminer la fonction comme
après quoi vous utilisez
notez qu'il y a une surcharge associée à l'utilisation de fonctions anonymes comme celle-ci, et ce n'est pas quelque chose que je ferais dans un code qui serait appelé des milliers de fois.
la source
Dans Matlab 2010a, j'ai trouvé une manière intéressante de faire ce que vous demandez. Il s'agit simplement d'utiliser le characher "~" (sans les guillemets bien sûr) comme variable factice (autant que vous le souhaitez lors du retour de plusieurs paramètres). Cela fonctionne également pour les paramètres d'entrée des fonctions si les fonctions sont conçues pour gérer les données manquantes. Je ne sais pas si cela existait dans les versions précédentes, mais je suis juste tombé dessus récemment.
la source
Vous pouvez créer une fonction (ou une fonction anonyme) qui ne renvoie que les sorties sélectionnées, par exemple
Ensuite, vous pouvez appeler votre fonction comme ceci:
Ou vous pouvez affecter la sortie à une variable:
la source
decimatedfftx = select(fft(x,12),1:4:12);
select(func,2)
appelsfunc(2)
. Je ne vois pas où cela sélectionne les arguments de sortie.Y a-t-il une raison de ne pas utiliser ans (n), comme ceci:
Donne b = 10, et cette façon ne serait-elle pas compatible avec toutes les versions de Matlab?
De plus, cela fonctionne pour obtenir le deuxième argument de sortie lorsque vous ne savez pas combien d'arguments il y aura! Alors que si vous faites ceci:
Alors b = 8000! (Vous devez terminer par ~, pour attraper plus d'arguments!)
la source
size(a)
et[b,c]=size(a)
renvoyer des choses différentes. Les fonctions de MATLAB changent de comportement en fonction du nombre d'arguments de sortie.