# How to make dynamic variable names (A1, A2, ..., An) with "for" loop? Using "eval" "num2str"?

2,449 views (last 30 days)
Italo on 13 Nov 2013
Commented: João on 6 May 2022
Hello community,
my knowledge of Matlab is limited, I admit it. So, I am sorry if I am going to make mistakes.
I have to create a series of variable using a "for" loop.
I make this:
for i=1:3
eval(['A' num2str(i) '= i'])
end
and it works well, it makes 3 variables A1, A2, A3.
But I need to use this variables to make other variables B1, B2, B3 where Bi=Ai*i. So I should have B1=A1*1=1, B2=A2*2=2*2=4, B3=A3*3=3*3=9
I tried something like this:
for i=1:3
eval(['A' num2str(i) '= i'])
eval(['B' num2str(i) '= 'A' num2str(i) '*i])
end
but it gives me error and it doesn't work. Of course I simplified things, the real code is a bt more complicated but I need to know the basics of how this could work.
Thank you
Steven Lord on 19 Jan 2022
I think of dynamic file names as somewhat different from dynamic variable names, as the file names are usually themselves data (passed into a function that reads the file contents then returns a variable whose name is not necessarily tied to the file name, or performs some other operation on the file.)
t = fullfile(tempdir, 'writeASeriesOfFiles');
if ~isfolder(t)
mkdir(t);
end
dir(t) % Nothing in this directory yet
. ..
for k = 1:5
fn = fullfile(t, "file" + k + ".txt");
% Now use fn as data in several function calls
fclose(fopen(fn, 'wt')); % Open and immediately close the file
doesItExist = isfile(fn);
if doesItExist
fprintf("File %s does exist!\n", fn)
else
fprintf("File %s does NOT exist!\n", fn)
end
end
File /tmp/writeASeriesOfFiles/file1.txt does exist! File /tmp/writeASeriesOfFiles/file2.txt does exist! File /tmp/writeASeriesOfFiles/file3.txt does exist! File /tmp/writeASeriesOfFiles/file4.txt does exist! File /tmp/writeASeriesOfFiles/file5.txt does exist!
dir(t)
. .. file1.txt file2.txt file3.txt file4.txt file5.txt

Stephen23 on 12 Jan 2016
Edited: Stephen23 on 19 Jun 2019
##### 2 CommentsShowHide 1 older comment
Giovanni Barbarossa on 27 Jun 2018
Hello, I have a similar need deriving from what it seems to be a limitation of the Classification Learner app. I am generating a cell array of tables with my program and want to try each of the tables as training features in the Classification Learner, but the app does not see cell arrays in the workspace. I do understand it's a bad idea to generate dynamic variable names, but what's the solution to my need? Thanks

Amit on 22 Jan 2014
Edited: Amit on 22 Jan 2014
Italo, I am glad you're trying out things on matlab.
Matlab is very good with matrixes. What you're doing in these can be done much easily. For example:
A = 1:3;
B = A.*A; %
You can find many tutorials online on how to use MAtlab. For example: http://www.mathworks.com/academia/student_center/tutorials/launchpad.html
##### 2 CommentsShowHide 1 older comment
Bruno Pop-Stefanov on 22 Jan 2014
I would like to add that eval is #1 in this list: Top 10 MATLAB code practices that make me cry

Jerry Olup on 28 Apr 2018
Edited: Jerry Olup on 28 Apr 2018
I did find dynamically named variables useful for a specific need. I have several files in a directory. Each file has a few columns that are read into a structure. It's convenient to read and simultaneously name the variables per a filename. For instance I read to a temp var then use the ill-advised exec capability to assign this to a variable specific to the file I read in. Looping, I read all files in the dir efficiently. 'files' is a cell array of file names discovered in that directory....
tmp = table(dataArray{1:end-1}, 'VariableNames', {'max_mag','max_noise','max_cnt'});
eval([files{i} '=tmp'])
I do see where this is not good for general variable naming, but I believe there's a niche usage in this case. Opinions? Best, Jerry
Jerry Olup on 12 Aug 2018
Edited: Stephen23 on 12 Aug 2018
Hi Stephen, I'll give the idea of provide parallel constructs where the file-specific variable references are in one cell while data is collected in structure. I've shifted in the last month or so to use python for preprocessing - so this problem has largely gone away and been replaces with xlsread, csvread etc.
>>files data are not restricted to valid field/variable names
My file names are conventionally, ascii with underscores and timestamps yyyymmdd_hhmmss type, so I do see where this is problem. They are pretty specific so I thought I was giving a concrete counter example in contrast to @Italo and @Muna, who started this thread naming generic matrices.
>>you have not given any reason why none of those methods would work.
You're absolutely correct. I latched onto that solution as it was elegant for what I needed.
Thanks for the interaction, best, Jerry

Gabor on 20 Sep 2021
T=table;
Date=datetime(2014,12,31);
eval(['Dynamic_var_name_' datestr(Date,'mm_dd_yyyy') '=T;']);
This is how you name dynamically a variable or a table or a cell or anything regardless if it is recommended or not.
Stephen23 on 20 Sep 2021
Edited: Stephen23 on 20 Sep 2021
Whether it is recommended or not is irrelevant.
The fact is that it forces beginners into writing slow, complex, inefficient code, as this thread already demonsrates:

César Silva Proaño on 12 Aug 2018
Hi, look I was doing something similar in order to create a function with the Krammer Method, for solving any size of matrix-equation problem. Look I created a function in order to do this, therefore, I needed to do it automatically, creating variables dinamically. Look at this fucntion.
function [ X ] = funcionMetodoKrammer( A )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
% ex: A = [-3 2 1 10;5 -8 3 15;-8 -9 10 20];
sizeA = size(A);
sizeFilasA = sizeA(1,1);
sizeColumnasA = sizeA(1,2);
if (sizeFilasA == sizeColumnasA - 1)
for (i = 1:sizeColumnasA)
genvarname('matrizColumna', num2str(i));
eval(['matrizColumna' num2str(i) '=A(:,i)']);
end
for (i = 1:sizeFilasA)
genvarname('matrizTemporalColumna', num2str(i));
end
for (i = 2:sizeFilasA)
genvarname('matrizIncognita', num2str(i));
end
else
msgbox('La matriz ingresada para el método Krammer es incorrecta');
end
for (i = 1:sizeFilasA)
genvarname('X', num2str(i));
genvarname('matrizIncognita', num2str(i));
eval(['X' num2str(i) '= det(matrizIncognita' num2str(i) ')/det(matrizASinResultado)']);
end
X = zeros(1,sizeFilasA);
for (i = 1:sizeFilasA)
genvarname('X', num2str(i));
eval(['X' '(1,' num2str(i) ')=X' num2str(i)]);
end
end
%{
Asuminedo que existen variables B1, B2 y B3 se pueden acceder a las
variables de la siguiente manera
B1 = 10; B2 = 11; B3 = 12;
for (i = 1:3)
genvarname('Prueba', num2str(i));
genvarname('B', num2str(i));
eval(['Prueba' num2str(i) '=' 'B' num2str(i) '+10']);
end
%}
I strongly disagree with the idea that you shouldn't use this because, if it exists I mean why not? It is not prohibited, and additionally it is very helpful in some cases.
Regards,
Sebastián
jonas on 11 Sep 2018
Edited: Stephen23 on 20 Sep 2021
"you just attack this method and you do not present an formal solution"
This is simply untrue. On the contrary, from what I've seen Stephen always provides a concrete solution when possible. Here's an example from 5 minutes ago ( link ) which is nothing out of the ordinary.
"But please make us all a favor and present a code, not just words or links..."
This is the mindset I see in a lot of younger students today - avoid instructions like the plague and feel entitled to a solution. Remember that no one is getting paid to read about your dynamic variables, so you should appreciate any replies including links and words (whatever that means).

João on 4 May 2022
Edited: João on 4 May 2022
I too have a potential reason to want to do what the original OP posted. My example is that I want to numerically solve a system of nonlinear functions, in which the number of functions and variables depend on the input. I don't think any of the suggested alternatives solve this case. Am I wrong?
João on 6 May 2022
@Stephen23 Yes, equations must be abe to be defined systematically depending on the number of objects. And yes, for each time increment I know which equations to use and which x, y, z, ... to define.
For two objects I would have something like:
x, y, z, j = vars # variables
eq1 = (m*g - k*(y - x)) * dt - m * (j - c) # where m, k, g and c are known values
eq2 = (k*(y - x) + m*g - k*x * dt - m * (z - d) # where m, k, g and d are known values
eq3 = m * (c + d) - m * (z + j)
eq4 = m*g*y - 1/2*k*(y-x)**2 + m*g*x - 1/2*k*(x-l)**2 + m*g*l - 1/2*k*(l)**2
- 1/2*m*(j**2 - c**2) - 1/2*m*(z**2 - d**2)
For three objects I would have something like:
x, y, z, j, l, f = vars # variables
eq1 = (m*g - k*(y - x)) * dt - m * (j - c) # where m, k, g and c are known values
eq2 = (k*(y - x) + m*g - k*(x - l) * dt - m * (z - d) # where m, k, g and d are known values
eq3 = (k*(x - l) + m*g - k*l) * dt - m * (f - e) # where m, k, g and e are known values
eq4 = m * (c + d + e) - m * (z + j + f)
eq5 = m*g*y - 1/2*k*(y-x)**2 + m*g*x - 1/2*k*(x-l)**2 + m*g*l - 1/2*k*(l)**2
- 1/2*m*(j**2 - c**2) - 1/2*m*(z**2 - d**2) - 1/2*m*(f**2 - e**2)
eq6 = j - c # assuming that the velocities of object 1 and object 2 are the same during impact, i.e. when object 1 hits objects 2 they have the same velocity
So this made me realise I have to keep making assumptions as the number of objects grows.
So I need to solve the equations explicitly by Runge-Kutta or Central Difference methods...
I need to restructure my code. Thank you for the constructive input!