필터 지우기
필터 지우기

How to iterate through the struct char to label a new struct correctly?

조회 수: 5 (최근 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?
(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
Image Analyst
Image Analyst 2023년 2월 22일
What is this nk function or array you're using???
Goncalo Costa
Goncalo Costa 2023년 2월 22일
This is just a function written by a colleague to process some data and give me some data back as a result. The data resulting from this function is in the form of a 1x30 struct with 2 fields as shown in the last image (I will rewire this onto the questions).

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

채택된 답변

Goncalo Costa
Goncalo Costa 2023년 2월 22일
I ended up solving it and I am placing here my answer:
% List of all the desired files in the folder
filePattern = fullfile(myFolder, 'sample*.mat'); %search for files
theFiles = dir(filePattern);
theFiles = natsortfiles(theFiles); %name of files and other info
%all data placed into a single struct w/ x fields
for x = 1 : length(theFiles)
baseFileName = theFiles(x).name;
[path, name, ext] = fileparts(theFiles(x).name);
data(1).(name) =nk('ref.mat','base.mat',baseFileName);
end
  댓글 수: 2
Stephen23
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
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));
  댓글 수: 1
Goncalo Costa
Goncalo Costa 2023년 2월 22일
When I use this it tell me the following error
Unable to resolve the name sample_10.mat.
I think I need to separate the .mat from the rest of the files names, I tried to do this using fileparts, but it doesn't work either.

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


Voss
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

카테고리

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

Community Treasure Hunt

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

Start Hunting!

Translated by