How to convert string to variable name ?
1.370 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Pradya Panyainkaew
am 13 Jan. 2018
Kommentiert: Walter Roberson
am 3 Nov. 2022
I try to do like this
if true
Varname=matlab.lang.makeValidName(strcat('Indiv_Reg_',Month))
end
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
Varname{1,1}
end
How Can I fix this problem ?
thanks in advance.
1 Kommentar
Stephen23
am 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.
Akzeptierte Antwort
Jan
am 13 Jan. 2018
Bearbeitet: Jan
am 13 Jan. 2018
This question is an evergreen. The solution is easy: Don't do this. It is a shot in your knee.
See:
- https://www.mathworks.com/matlabcentral/answers/304528-tutorial-why-variables-should-not-be-named-dynamically-eval
- https://www.mathworks.com/matlabcentral/answers/57445-faq-how-can-i-create-variables-a1-a2-a10-in-a-loop
- and hundreds of discussions concerning eval in this forum.
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.
5 Kommentare
Walter Roberson
am 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?
Weitere Antworten (3)
Luna
am 4 Jan. 2019
Bearbeitet: Luna
am 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);
end
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.
4 Kommentare
Luna
am 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.
Gabor
am 18 Feb. 2021
Bearbeitet: Gabor
am 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)
4 Kommentare
Govind Narayan Sahu
am 17 Jun. 2022
Bearbeitet: Govind Narayan Sahu
am 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)))
end
Anshuman Agrawal
am 19 Jun. 2020
Bearbeitet: Anshuman Agrawal
am 19 Jun. 2020
Hopefully, what you wanted to do was covered here.
0 Kommentare
Siehe auch
Kategorien
Mehr zu Programmatic Model Editing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!