How to iterate through the struct char to label a new struct correctly?
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Goncalo Costa
le 22 Fév 2023
Modifié(e) : Stephen23
le 22 Fév 2023
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?
(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 commentaires
Réponse acceptée
Goncalo Costa
le 22 Fév 2023
2 commentaires
Stephen23
le 22 Fév 2023
Modifié(e) : Stephen23
le 22 Fév 2023
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:
Plus de réponses (2)
Oguz Kaan Hancioglu
le 22 Fév 2023
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
le 22 Fév 2023
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 commentaires
Voir également
Catégories
En savoir plus sur Structures 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!