How to iterate through the struct char to label a new struct correctly?
1 次查看(过去 30 天)
显示 更早的评论
I know that when I create a structure, e.g.
fruits(1).apples = data1;
fruits(1).bananas = data2;
I obtain a structure with two fields, and each fields having their respective data1 and data2. What I am attempting to do is loosely based on this.
The same way that above I have labelled my fields "apples" and "bananas", I have a 9x1 field with the names of what I shall label my data fields (shown in the code below).
% List of all the desired files in the folder
%the names of my files are: sample_1, sample_10, sample_13, etc.
filePattern = fullfile(myFolder, 'sample*.mat'); %search for files
theFiles = dir(filePattern);
theFiles = natsortfiles(theFiles); %arrange the files names in numerical order
%the data is a 1x30 structure
for x = 1 : length(theFiles)
baseFileName = theFiles(x).name; %e.g. for x =1 , baseFileName = 'sample_1.mat'
data(1).baseFileName =nk('ref_K15rapidscan.mat','base_K15rapidscan.mat',baseFileName);
end
%nk is a function to process data and to give other data back. The data resulting from this is a 1x30 struct with 2 fields
The problem is that I cannot simply write "data(1).baseFileName", as MATLAB doesn't recognise that baseFileName is a different char each time on the last line
data(1).baseFileName =nk('ref_K15rapidscan.mat','base_K15rapidscan.mat',baseFileName);
How can I end up with something like the image below?
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1303565/image.png)
(The image might make it look like I actually got it to work, but really I just changed the name of the fields (apple, pear banana, etc) by hand to sample_1, etc.
2 个评论
采纳的回答
Goncalo Costa
2023-2-22
2 个评论
Stephen23
2023-2-22
编辑:Stephen23
2023-2-22
Not that this is fragile data design: there are many characters which are valid in filenames which are not valid in fieldnames. When you get such a character, this code will fail.
For much more robust code which does not duplicate data in extra variables, see the answer I gave you earlier:
更多回答(2 个)
Oguz Kaan Hancioglu
2023-2-22
You can use eval function to use char arrays or strings as a matlab command.
data(1).baseFileName =nk('ref_K15rapidscan.mat','base_K15rapidscan.mat',eval(baseFileName));
Voss
2023-2-22
for x = 1 : length(theFiles)
baseFileName = theFiles(x).name; %e.g. for x =1 , baseFileName = 'sample_1.mat'
[~,fn,~] = fileparts(baseFileName);
data(1).(fn) = nk('ref_K15rapidscan.mat','base_K15rapidscan.mat',baseFileName);
end
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Structures 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!