web-dev-qa-db-fra.com

Créer des variables avec des noms à partir de chaînes

Supposons que je souhaite créer 10 variables qui ressembleraient à ceci:

x1 = 1;
x2 = 2;
x3 = 3;
x4 = 4;
.
.
xi = i;

Il s'agit d'une version simplifiée de ce que j'ai l'intention de faire. Fondamentalement, je veux simplement enregistrer les lignes de code en créant ces variables de manière automatisée. Y a-t-il la possibilité de construire un nom de variable dans Matlab? Le modèle dans mon exemple serait ["x", num2str(i)]. Mais je ne peux pas trouver un moyen de créer une variable avec ce nom.

17
Potaito

Vous pouvez le faire avec eval mais vous devriez vraiment pas

eval(['x', num2str(i), ' = ', num2str(i)]); %//Not recommended

Utilisez plutôt un tableau de cellules:

x{i} = i
28
Dan

Je conseille également fortement d'utiliser un tableau de cellules ou une structure pour de tels cas. Je pense que cela vous donnera même une amélioration des performances.

Si vous en avez vraiment besoin, Dan vous a expliqué comment le faire. Mais je voudrais également souligner la fonction genvarname. Il s'assurera que votre chaîne est un nom de variable valide.

EDIT: genvarname fait partie du noyau matlab et non de la boîte à outils des statistiques

5
bdecaf
for k=1:10
   assignin('base', ['x' num2str(k)], k)
end
4
MasterJedi

Bien qu'il soit attendu depuis longtemps, je voulais juste ajouter une autre réponse.

la fonction genvarname est exactement pour ces cas

et si vous l'utilisez avec un tableau de structure tmp, vous n'avez pas besoin de la cmd eval

l'exemple 4 de ce lien est de savoir comment le faire http://www.mathworks.co.uk/help/matlab/ref/genvarname.html

 for k = 1:5
   t = clock;
   pause(uint8(Rand * 10));
   v = genvarname('time_elapsed', who);
   eval([v ' = etime(clock,t)'])
   end

bonne chance

eyal

2
eyalsoreq

Si quelqu'un d'autre est intéressé, la syntaxe correcte de la réponse de Dan serait:

eval(['x', num2str(i), ' = ', num2str(i)]);

Ma question contenait déjà la mauvaise syntaxe, c'est donc ma faute.

1
Potaito

J'avais besoin de quelque chose comme ça, car vous ne pouvez pas référencer des structures (ou des tableaux de cellules, je suppose) à partir de l'espace de travail dans les blocs Simulink si vous voulez pouvoir les modifier pendant la simulation.

Quoi qu'il en soit, pour moi, cela a fonctionné le mieux

assignin('base',['string' 'parts'],values);
0
Fabian Jonsson