How to convert string to variable name ?

2,127 views (last 30 days)
I try to do like this
if true
where Month is a input variable represent char '01,02,...,12'
My problem is I cannot refer variable such as 'Indiv_Reg_01' to get a data from this variable. For example, I cannot get data from Indiv_Reg_01{1,1} by using this code
if true
How Can I fix this problem ?
thanks in advance.
  1 Comment
Stephen23 on 13 Jan 2018
"My problem is I cannot refer variable such as 'Indiv_Reg_01' to get a data from this variable"
The problem is that you are hiding pesudo-indices in variable names. Turn them into real indices and your "problem" instantly goes away. Solving problems through better code design is always preferred to writing slow, buggy, hack code accessing variable names.

Sign in to comment.

Accepted Answer

Jan on 13 Jan 2018
Edited: Jan on 13 Jan 2018
This question is an evergreen. The solution is easy: Don't do this. It is a shot in your knee.
Do not hide indices in the names of variables, but use indices instead: Let Indiv_Reg be a cell array and use the numerical value as index. This is much better than the indirection over the conversion to a string and hiding it in the names of dynamically created variables.
Walter Roberson
Walter Roberson on 3 Nov 2022
When we visit the site like this and post our questions, we are looking for a direct 'answer' to our question.
This site gets quite a lot of questions from students. A fair portion of the students are "looking for" complete working code for their homework or honours project, that they can submit as their own work, without having to learn how to solve the problems themselves. Does it follow that we should provide that to them?

Sign in to comment.

More Answers (3)

Luna on 4 Jan 2019
Edited: Luna on 4 Jan 2019
Hi all,
I agree with Jan & Stephen what they said about eval function. Don't use it. Instead use struct and arrays with dynamic naming.
For this example I have created a solution you can check:
Month = '01,02,03,04,05,06,07,08,09,10,11,12';
monthsArray = strsplit(Month,',');
for i = 1:numel(monthsArray)
Varnames{i} = matlab.lang.makeValidName(strcat('Indiv_Reg_',monthsArray{i}));
myStruct.(Varnames{i}) = randi(20,1,1);
myStruct.(Varnames{1,1}) % should give you a value of a random number
myStruct.Indiv_Reg_01 % same result above
ps: if you are forced to name your variables use this. Otherwise use directly indices of your Nx12 array.
Luna on 1 Jun 2020
Believe me you will put much more effort to the solution you are asking for in your way rather than "just redoing all scripts you got".
You will spend time just for once redoing your code with indexing and implementing arrays. After that you will be free. Think that when you want to change a single variable name, that will force you to "redo all your scripts" again.
I only use eval if I'm running Simulink models with from Workspace blocks.
Don't use it if you really don't know what eval is used for. Here is some informations about justifiable usages of eval. These advices are from Matlab experts, at least they know some programming better than most.

Sign in to comment.

Gabor on 18 Feb 2021
Edited: Gabor on 18 Feb 2021
Your answer does not work if you only have hammer and a screw available at hand (curvfitting tool does not accept structs as variable for eg.). In that case its perfect to use the hammer to pop that screw in fast :D
I found this:
assignin('base',var_name, value)
Govind Narayan Sahu
Govind Narayan Sahu on 17 Jun 2022
Edited: Govind Narayan Sahu on 17 Jun 2022
This works perfectly fine for me. Thanks a lot.
data = rand(1,8);
vars = {'a', 'b', 'd', 'e', 'f', 'g', 'h', 'i'};
index_vars = 1:8;
for k = 1:length(vars)
assignin('base',vars{k}, data(1, index_vars(k)))

Sign in to comment.

Anshuman Agrawal
Anshuman Agrawal on 19 Jun 2020
Edited: Anshuman Agrawal on 19 Jun 2020
Hopefully, what you wanted to do was covered here.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!