2016-11-19 3 views
0

Je souhaite écrire une fonction MATLAB pouvant prendre un nombre indéfini de variables, modifier leurs valeurs et les exporter sous les mêmes noms. Je suis en partie là-bas si je ne me dérange pas la liste des variables deux fois:Fonction MATLAB pour réaffecter des valeurs d'un nombre indéfini de variables

function [varargout]=testing(varargin) 
    for i=1:nargin 
     varargout{i}=varargin{i}*2; 
    end 
end 

et

x=5; 
y=3; 
z=6; 
[x,y,z]=testing(x,y,z); 

Mais je ne veux pas énumérer les noms de variables deux fois. Y at-il de toute façon je peux appeler la fonction comme ceci à la place? J'ai essayé d'utiliser inputname, mais je n'ai pas réussi à comprendre comment le faire fonctionner.

Répondre

1

Il est fortement déconseillé d'ajuster aveuglément les valeurs sur les espaces de travail et cela peut entraîner des bogues difficiles à détecter et rendre le code difficile à maintenir. Arguments contre cela essentiellement miroir arguments against global variables. Il sera beaucoup plus fiable de contrôler explicitement les données que vous voulez manipuler. Oui, cela vous demandera probablement de stocker vos données différemment.

Par exemple, vous pouvez utiliser un structure:

function testcode() 
mydata.a = 1; 
mydata.b = 2; 
mydata.c = 3; 
mydata.d = 4; 

mydata = multiplydata(mydata, 2); 
disp(mydata) 
end 

function [datastruct] = multiplydata(datastruct, n) 
varnames = fieldnames(datastruct); 
for ii = 1:length(varnames) 
    datastruct.(varnames{ii}) = datastruct.(varnames{ii})*n; 
end 
end 

qui délivre en sortie:

>> testcode 
    a: 2 
    b: 4 
    c: 6 
    d: 8 

Ce n'est pas vraiment fonctionnel différent que d'utiliser varargin/varargout, mais si vous écrivez votre code de telle manière que vous utilisiez des structures depuis le début, vous n'avez pas à gérer l'étape supplémentaire de déballage (par exemple, x = varargin{1}, etc.).


Si, pour une raison quelconque, vous devez absolument doit ajuster aveuglément vos variables (qui, encore une fois, s'il vous plaît ne pas), vous pouvez utiliser assignin:

function testcode() 
a = 1; 
b = 2; 
c = 3; 
d = 4; 

multiplydata(2, a, b, c, d); 
fprintf('a: %u\nb: %u\nc: %u\nd: %u\n', a, b, c, d) 
end 

function multiplydata(n, varargin) 
for ii = 1:length(varargin) 
    varname = inputname(ii + 1); 
    assignin('caller', varname, varargin{ii}*n) 
end 
end 

qui retourne:

>> testcode 
a: 2 
b: 4 
c: 6 
d: 8