2010-05-11 24 views
7

Tengo una variable a = 1. Quiero generar un nombre de variable de la forma:¿Cómo concatenar un número a un nombre de variable en MATLAB?

variableNumber 

lo tanto, en este ejemplo, me gustaría que

a1 
a2 
a3 

como variables. ¿Cómo puedo hacer eso?

+7

Aunque esto es posible, por supuesto (como las respuestas ya lo demostraron), no es muy útil en la mayoría de los casos. ¿Hay alguna razón por la cual no se puede usar una estructura o matriz? – groovingandi

+2

Gracioso. Hace un tiempo, uno de mis colegas que no programaron hizo la misma pregunta . Mi respuesta fue "no". Luego le mostré cómo podría usar una matriz para el mismo propósito. – Kena

+0

Creo que esto debería mencionarse: [¿Cómo puedo crear las variables A1, A2, ..., A10 en un bucle?] (Http://matlab.wikia.com/wiki/FAQ#How_can_I_create_variables_A1.2C_A2.2C ... ..2CA10_in_a_loop.3F) – Amro

Respuesta

9

Trate genvarname.

varname = genvarname(str) 

es la sintaxis básica para su uso. La documentación de MATLAB contiene ejemplos detallados del uso de esta función con una lista de exclusión (para garantizar nombres únicos de variables). Tendrá que usar eval u otra función (por ejemplo, assignin, mencionada en una respuesta anterior) para utilizar este nombre de variable.

Para responder a la pregunta por completo,

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

Por supuesto, hay formas más eficientes de la elaboración de una lista de entrada para genvarname, esto se deja como ejercicio;)

Si eres preocupado por el rendimiento, tenga en cuenta que eval puede ralentizar la secuencia de comandos/función en gran medida; Personalmente, recomendaría el uso de tipos de datos struct o cell si necesita nombres dinámicos de variables.

+0

Utilice matrices de celdas, estructuras, matrices 3D u otras formas de almacenar datos, pero no variables en el espacio de trabajo. – Oleg

5

Use assignin.


EDIT: Como se ha mencionado JS, las estructuras son generalmente mejores para nombres de campos dinámicos. Puede utilizarlos como esto:

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 

O aún más simple, como esto:

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

Mi respuesta a esta pregunta es "¿Estás seguro de que realmente quieres hacer eso?"

Si tiene una serie de variables como esta, entonces tendrá que encontrar una manera de referirse a todas esas variables más adelante, que probablemente signifique un EVAL o algo similar.

Si sabe que todo lo que se va a almacenar en este será un escalar, podría almacenar todos ellos en un vector:

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

¿Qué pasa si usted no tiene escalares?

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

Entonces puede referirse a estos como {1} o lo que sea.

A menos que tengas una buena razón para hacer esto, es mejor que fabriques una matriz de celdas, una matriz de estructuras, vectores o alguna otra cosa.

+0

Tenga en cuenta que, siempre que todas las entradas sean numéricas y se garantice que tienen el mismo tamaño, debe usar una matriz. Se almacenan y manejan de manera más eficiente que las matrices de celdas. Pequeño ejemplo: 'claro a; a (1,:, :) = rand (3); a (2,:, :) = magia (3) ' –

2

Mi respuesta a esta pregunta es "¿Estás seguro de que realmente quieres hacer eso?"

Pero si su respuesta es sí, entonces esa es su respuesta:

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

He estado usando este código para una aplicación con redes neuronales 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 
Cuestiones relacionadas