124 votes

Comment ignorer élégamment certaines valeurs de retour d’une fonction MATLAB ?

Je me demandais si il était possible d'obtenir le n-ième valeur de retour d'une fonction sans avoir à créer des variables muettes pour tous les n-1 valeurs de retour avant.

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 suis seulement intéressé à la troisième valeur de retour. Ceci peut être accompli par la création (au moins) une variable muette, mais je pense que c'est laid:

[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;

Je pense que vous pourriez être en mesure de faire quelque chose comme l'une des choses suivantes, mais vous ne pouvez pas:

[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);

Il n'existe aucun élégante des façons de le faire que faire du travail?


Jusqu'à présent, la meilleure solution est d'utiliser simplement le variableThatIWillUse comme une variable muette. Cela m'évite d'avoir à créer une véritable variable muette qui polutes l'espace de travail (ou que j'aurais besoin de l'effacer). En bref: la solution est d'utiliser la variableThatIWillUse pour chaque valeur de retour jusqu'à l'intéressant. Les valeurs de retour après peut être simplement ignoré:

[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;

Je pense toujours que c'est très laid code, mais si il n'y a pas de meilleure façon, alors je crois que je vais accepter la réponse.

240voto

ManWithSleeve Points 1409

Avec MATLAB Version 7.9 (R2009b), vous pouvez utiliser un ~, par exemple,

Notez que le n’est pas facultatif. Juste en tapant ne fonctionnera pas et lèvera une erreur.

Voir les notes de publication pour plus de détails.

41voto

Jason S Points 58434

EDIT: Depuis le 2009b la libération de la solution correcte est:

[~, ~, variableThatIWillUse] = myFunction();

comme par ManWithSleeve de réponse.


C'est un peu un hack, mais il fonctionne:

D'abord un rapide exemple la fonction de:

Func3 = @() deal(1,2,3);
[a,b,c]=Func3();
% yields a=1, b=2, c=3

Maintenant, la clé ici est que si vous utilisez une variable à deux reprises dans la main gauche côté d'une expression d'affectation, une précédente affectation est assommé par le plus tard affectation:

[b,b,c]=Func3();
% yields b=2, c=3

[c,c,c]=Func3();
% yields c=3

(edit: juste pour vérifier, j'ai aussi vérifié que cette technique fonctionne avec [mu,mu,mu]=polyfit(x,y,n) , si vous vous souciez de polyfit est le 3ème argument)

14voto

gnovice Points 70970

Voici une autre option que vous pouvez utiliser. Faites d'abord une matrice de cellules de capturer toutes les sorties (vous pouvez utiliser le NARGOUT fonction pour déterminer le nombre de sorties de la fonction retourne):

a = cell(1,3);  % For capturing 3 outputs
% OR...
a = cell(1,nargout(@func));  % For capturing all outputs from "func"

Puis appeler la fonction comme suit:

[a{:}] = func();

Puis il suffit de supprimer l'élément à partir d'une que vous voulez, et de remplacer un:

a = a{3};  % Get the third output

9voto

shabbychef Points 662

J’ai écrit un kth fonction :

vous pouvez ensuite appeler

vous pourriez aussi envelopper les tableaux fonctionnent comme

après quoi vous utilisez

Remarque qu’il y a surcharge associés à l’utilisation des fonctions anonymes comme ça, et ce n’est pas quelque chose que je ferais dans le code qui s’appellerait des milliers de fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X