2 votes

Matlab : passez la sortie 'who' en tant qu'argument

J'ai écrit une fonction qui prend les noms et les valeurs des variables d'entrée et les écrit dans un fichier. par exemple.

a = 10;
b = 100;
writevars('file.txt',a,b);

me donne un fichier file.txt qui contient:

\def\a{\num{10}}
\def\b{\num{100}}

J'aimerais maintenant être en mesure de transmettre toutes les variables trouvées en utilisant la commande who. Par exemple si who renvoie:

a    b    z

J'aimerais pouvoir utiliser writevars comme si j'avais appelé writers('file.txt', a, b, z).

Le problème principal que j'ai est que writevars utilise inputname... (les variables temporaires ne fonctionneront pas par exemple writevars('file.txt', 100) ne fonctionne pas car il n'y a pas de nom à donner dans le fichier).

RÉPONSE

var_names = who;
for i = 1 : length(var_names)
    evalin('caller',['writevars(''file.txt'', ' char(var_names(i)) ' )']);
end

3voto

Jonas Points 54073

Vous pouvez utiliser EVALIN pour exécuter who à partir de writevars, par exemple.

function writevars(filename,varargin)

%# obtenir une liste de noms de variables dans l'espace de travail appelant et lire leurs valeurs
if isempty(varargin)
   listOfVars = evalin('caller','who');
   values = cell(size(listOfVars));
   for i=1:length(listOfVars)
      values{i} = evalin('caller',listOfVars{i});
   end
else
   %# utiliser inputname pour lire les noms de variables dans listOfVars
end

%# --- reste de writevars ici ---

0voto

Andrey Points 13705

Il peut être utilisé en utilisant la valeur de retour de la commande whos :

function GetAllVars
a = 45;
x = 67;    
ff = 156;
z = who();
for i=1:numel(z)
    if ~isequal(z{i},'z')
        fprintf(1,'%s = %f\n',z{i},eval(z{i}));
    end
end

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