Creating a Dynamic Variable for Table Names

조회 수: 63 (최근 30일)
Zach
Zach 2023년 5월 30일
이동: Walter Roberson 2023년 6월 5일
I am creating a code that will take multiple data sets and plot the data over top of eachother. To do this, I take csv files and make a table, (so I can compare individual variable.) I have a function that does this. However, the problem I have is the undicided amount of table I will need at a given time. This lead me into looking into dynamic variables. So at the top of my code I can input 5 for the number of tables (or any number of tables I need). Then each of my tables can be name A1, A2...A5. At the end of my code I need to be able to plot something like this:
plot(A1.red)
hold on
plot(A2.red)....
plot(A5.red)
Looking into dynamic variable this would not be the best way to go about. I could create a large amount of tables and use 'exist' to eliminatie ones I dont need but I would like it to be more fluid than that. Also I want this code to be able to used for a long time so allowing it to change depending on what the used needs would be ideal.
  댓글 수: 1
Stephen23
Stephen23 2023년 5월 30일
편집: Stephen23 2023년 5월 30일
" However, the problem I have is the undicided amount of table I will need at a given time"
Why is that a problem? MATLAB arrays can be any size, and there is absolutely nothing stopping you from storing those tables in e.g. one cell array. All MATLAB users do this, what is stopping you?
"but I would like it to be more fluid than that."
Then you should be using one array and indexing. Just like MATLAB is designed for: the name MATALB comes from "MATrix LABoratory" and not from "Lets stick all of the data in thousands of separate variables and make accessing data slow and complex".
" I want this code to be able to used for a long time so allowing it to change depending on what the used needs would be ideal."
It sounds like a cell array would be ideal, or a non-scalar structure:

댓글을 달려면 로그인하십시오.

답변 (2개)

Steven Lord
Steven Lord 2023년 5월 30일
Can you dynamically create variables with numbered names like A1, A2, A3, etc.? Yes.
Should you do this? The general consensus is no. That Answers post explains why this is generally discouraged and offers several alternative approaches.
Depending on what you're trying to do a struct array each field of which contains a table, a cell array each cell of which contains a table, or a table with one variable containing an identifier are possibilities. In the latter case you would then use indexing (or perhaps groupsummary or other grouping functions) to operate on subsets of the table.
groups = "A" + randi(3, 10, 1);
data = randperm(10).';
T = table(groups, data)
T = 10×2 table
groups data ______ ____ "A3" 8 "A2" 5 "A2" 9 "A1" 7 "A3" 4 "A2" 1 "A3" 2 "A1" 10 "A2" 3 "A1" 6
group1 = T(T.groups == "A1", :)
group1 = 3×2 table
groups data ______ ____ "A1" 7 "A1" 10 "A1" 6
  댓글 수: 5
Stephen23
Stephen23 2023년 5월 30일
편집: Stephen23 2023년 5월 30일
"I think dynamic variable would still be better..."
That is very unlikely. Your approach will be complex, slow, inefficient, and harder to debug: https://www.mathworks.com/matlabcentral/answers/304528-tutorial-why-variables-should-not-be-named-dynamically-eval
"... than this as I dont think this address my problem"
However it does address all of the other problems that you are about to cause with your bad data design.
It is very unlikely that your actual goal is to store lots of data with particular variable names. Most likely your goal is to process that data in a particular way... but instead of asking us a question like "how can I arrange my data so that I can efficiently and easily process my data like this..." you asked us about your own concept of how to do it (which is best avoided). Understand the difference: https://xyproblem.info/
The answer will be to use arrays. Because that is the simple, easy, and very efficient way to use MATLAB.
Zach
Zach 2023년 5월 30일
이동: Walter Roberson 2023년 6월 5일
Thanks you Walter Roberson and Steven Lord. This exactly what I looking for. I didnt know this existed.
Thanks

댓글을 달려면 로그인하십시오.


Seth Furman
Seth Furman 2023년 6월 5일
Since R2022b, you can plot variables from multiple tables and timetables in a single plot with stackedplot.
tbls = { array2table(rand(3,2)), array2table(rand(3,2)), array2table(rand(3,2)) }
tbls = 1×3 cell array
{3×2 table} {3×2 table} {3×2 table}
tbls{1}
ans = 3×2 table
Var1 Var2 _______ _______ 0.93152 0.32289 0.08929 0.23156 0.3017 0.54319
tbls{2}
ans = 3×2 table
Var1 Var2 _______ _______ 0.57526 0.38108 0.82018 0.04219 0.37221 0.79734
tbls{3}
ans = 3×2 table
Var1 Var2 _______ ________ 0.12006 0.23846 0.55645 0.91375 0.6885 0.084278
stackedplot(tbls, "Var1")
stackedplot(tbls, "Var1", CombineMatchingNames=false)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by