Effacer les filtres
Effacer les filtres

I want to name variables while writing into matfile in a for loop

2 vues (au cours des 30 derniers jours)
Omer Yasin Birey
Omer Yasin Birey le 7 Déc 2018
Commenté : Walter Roberson le 7 Déc 2018
I have a loop over dates and all the value(mostly cell arrays) comes out from this loop is going to be saved into matfile. But I want to name those variables by this dates I've been looping over. You can see this part of the code below.
m = matfile('myFile.mat','Writable',true);
d1=datenum(dateStart);
d2=datenum(dateEnd);
for Date = d1:d2
...
....
m.datestr(Date) = outCell;
end
but obviously that doesn't work. It says "To index into the new variable 'datestr', specify at least two dimensions. MatFile objects do not support linear indexing".
  2 commentaires
Stephen23
Stephen23 le 7 Déc 2018
Modifié(e) : Stephen23 le 7 Déc 2018
That is very bad data design. Using serial date numbers as an index:
  1. will likely face numeric issues with the floating point numbers used.
  2. is an inefficient waste of memory: consider that today (for example) has the serial date number 737401: this means that to store just one data value you would have to create an array with nearly one million elements in it!
Using serial date numbers as indices is tantamount to putting meta-data into variable names or fieldnames: meta-data is data, and so it should be stored as data, not as indices.
"But I want to name those variables by this dates I've been looping over"
That is very bad data design. Meta-data, such as your dates, should not be forced into variable names or fieldnames. Read this to know why:
Instead, you should keep your data in arrays and use efficient indexing. Simply storing the data in two arrays with corresponding elements would likely be the simple MATLAB solution:
dates = [D1,D2, ..., Dn]
data = {C1,C2, ..., Cn}
Or you could use a table. Or a structure:
S(1).date = D1
S(1).data = C1
...
S(n).date = Dn
S(n).data = Cn
All of those would be easy to define in a loop, or at once using table, struct, etc.
Omer Yasin Birey
Omer Yasin Birey le 7 Déc 2018
Thanks Stephen your answer is quite helpful. However, Im taking the dates as inputs from user. So, I only have 2 variables(about dates) which are start and end. The only thing that follows the dates, is the index of the loop. That's why it feels like it has to be dynamic.

Connectez-vous pour commenter.

Réponses (1)

Walter Roberson
Walter Roberson le 7 Déc 2018
Do the datestr(Date) and store the string into a variable . Then use dynamic field naming .
m.(date_string) = values
You do not really need to use aa temporary variable but it helps make code clearer .
  6 commentaires
Walter Roberson
Walter Roberson le 7 Déc 2018
You could also consider using containers.Map for fast access .
Walter Roberson
Walter Roberson le 7 Déc 2018
Using this approach of dynamic field names is probably not the best, but it can have its uses, especially when there are external interface requirements.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by