2010-05-11 5 views
7

J'ai une variable a = 1. Je veux générer un nom de variable de la forme:Comment concaténer un nombre à un nom de variable dans MATLAB?

variableNumber 

Ainsi, dans cet exemple, je ne voudrais

a1 
a2 
a3 

comme variables. Comment puis je faire ça?

+7

Bien que ce soit bien sûr possible (comme les réponses le montraient déjà), il n'est pas très utile dans la plupart des cas.Y a-t-il une raison pour laquelle une structure ou un tableau ne peut pas être utilisé? – groovingandi

+2

Funny.Un de mes collègues hors programmation a posé la même question la semaine dernière Ma réponse était "ne pas", puis je lui ai montré comment il pouvait utiliser un tableau pour le même but. – Kena

+0

Je pense que cela devrait être mentionné: [Comment puis-je créer des variables A1, A2, ..., A10 dans une boucle?] (Http://matlab.wikia.com/wiki/FAQ#How_can_I_create_variables_A1.2C_A2.2C .. ..2CA10_in_a_loop.3F) – Amro

Répondre

9

Essayez genvarname.

varname = genvarname(str) 

est la syntaxe de base à utiliser. La documentation MATLAB contient des exemples détaillés d'utilisation de cette fonction avec une liste d'exclusion (pour garantir des noms de variables uniques). Vous devrez utiliser eval ou une autre fonction (par exemple assignin, mentionnée dans une réponse précédente) pour utiliser ce nom de variable.

Pour répondre à la question complètement,

varnamelist = genvarname({'a','a','a','a','a'}); 
for l=1:length(varnamelist) 
    eval([varnamelist{l} '= l^2']); 
end 

Bien sûr, il existe des moyens plus efficaces de mettre sur pied une liste d'entrée pour genvarname, cela est laissé en exercice;)

Si vous êtes préoccupé par les performances, notez que eval peut ralentir considérablement le script/la fonction; Personnellement, je recommanderais l'utilisation de types de données struct ou cell si vous avez besoin de noms de variables dynamiques.

+0

Utilisez des tableaux de cellules, des structures, des tableaux 3D ou d'autres moyens pour stocker des données, mais ne collez pas de variables dans l'espace de travail. – Oleg

5

Utilisez assignin.


EDIT: Comme JS mentionné, struct sont généralement mieux pour les noms de champs dynamiques. Vous pouvez les utiliser comme ceci:

varnames = {'foo', 'bar'}; 
str = struct; 
for i = 1:length(varnames) 
    str = setfield(str, varnames{i}, rand); %#ok<SFLD> 
end 

str =  
    foo: 0.4854 
    bar: 0.8003 

Ou encore plus simplement, comme ceci:

str2.('alpha') = 123; 
str2.('beta') = 1:10; 
19

Ma réponse à cette question est "Êtes-vous sûr de vouloir vraiment faire cela?"

Si vous avez une série de variables comme celle-ci, vous allez devoir trouver un moyen de vous référer à toutes ces variables plus tard, cela signifiera probablement un EVAL ou quelque chose comme ça.

Si vous savez que tout ce que vous stockerez dans ce sera un scalaire, vous pouvez les stocker dans un vecteur:

a(1) = 1; 
a(2) = 2; 
a(3) = 3; 

Que faire si vous n'avez pas scalaires?

a{1} = 1; 
a{2} = 'Doug'; 
a{3} = [1 2 3 4]; 

Ensuite, vous pouvez les appeler comme {1} ou autre. À moins que vous n'ayez une bonne raison de le faire, vous feriez mieux de créer un tableau de cellules, un tableau de structures, un vecteur ou autre chose.

+0

Notez que tant que toutes les entrées sont numériques et ont la même taille, vous devez utiliser une matrice. Ils sont stockés et traités plus efficacement que les réseaux de cellules. Petit exemple: 'clear a; a (1,:, :) = rand (3); a (2,:, :) = magie (3) ' –

2

Ma réponse à cette question est "Etes-vous sûr de vouloir vraiment faire cela?"

Mais si votre réponse est oui, alors c'est votre réponse:

for k=1:5 
    eval(['a' num2str(k) '= k;']) 
end 
0

Je me sers de ce code pour une application avec les réseaux de neurones Bootstrap

% k fold test with automatic division of data 

warning off 

% read in X 
% read in T 

% perform k fold division of input time series called 'K-fold Cross-Validation 
% Bootstrap' 

CVO = cvpartition(X,'k',10); % creates 10 sub samples of 'X' and divides it into 'training (i.e training and validation)' and 'testing' sets 

for i = 1:CVO.NumTestSets 
    eval(['xtv' num2str(i) '=X(CVO.training(i));']) % cross-validation training sets of 'X' 
    eval(['xt' num2str(i) '=X(CVO.test(i));']) % cross-validation testing set of 'X' 
    eval(['ttv' num2str(i) '=T(CVO.training(i));']) % cross-validation training set of 'T' 
    eval(['tt' num2str(i) '=T(CVO.test(i));']) % cross-validation testing set of 'T' 
end 
Questions connexes