필터 지우기
필터 지우기

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

조회 수: 2 (최근 30일)
Omer Yasin Birey
Omer Yasin Birey 2018년 12월 7일
댓글: Walter Roberson 2018년 12월 7일
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
Stephen23
Stephen23 2018년 12월 7일
편집: Stephen23 2018년 12월 7일
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 2018년 12월 7일
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.

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

답변 (1개)

Walter Roberson
Walter Roberson 2018년 12월 7일
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
Walter Roberson
Walter Roberson 2018년 12월 7일
You could also consider using containers.Map for fast access .
Walter Roberson
Walter Roberson 2018년 12월 7일
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.

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

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by