How to load multiple .mat files which are having subfile in .mat format using the loop?

조회 수: 5 (최근 30일)
How to load multiple .mat files which are having subfile in .mat format using the loop?
  댓글 수: 1
Sarvesh Kale
Sarvesh Kale 2023년 2월 7일
You can also import the mat files in directory using the import data option found under Home tab of MATLAB

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

채택된 답변

Stephen23
Stephen23 2023년 2월 7일
편집: Stephen23 2023년 2월 7일
Unfortunately the data in those MAT files is very badly designed, because each MAT file uses a changing prefix on the variable names. Ugh. Much better would be if the variable names were exactly the same in every MAT file, then your code would be simpler, more efficient, and much more robust.
Do NOT use ASSIGNIN() or try to LOAD() all of those variables directly into the workspace: this will just make the rest of your code slow and complex when you try to access those variables.
But with some effort we can work with what you have:
P = '.'; % absolute or relative path to where the files are saved.
S = dir(fullfile(P,'B007*.mat'))
S = 2×1 struct array with fields:
name folder date bytes isdir datenum
for k = 1:numel(S)
F = fullfile(S(k).folder,S(k).name);
D = load(F) % ugh ugh ugh, that ugly prefix on those poor variable names!
D = cell2struct(struct2cell(D),regexprep(fieldnames(D),'^\w\d+_?',''),1); % much better.
S(k).data = D;
end
D = struct with fields:
X118_DE_time: [122571×1 double] X118_FE_time: [122571×1 double] X118_BA_time: [122571×1 double] X118RPM: 1796
D = struct with fields:
X119_DE_time: [121410×1 double] X119_FE_time: [121410×1 double] X119_BA_time: [121410×1 double] X119RPM: 1772
D = [S.data] % aaah, now that is the best way to store your imported data!
D = 1×2 struct array with fields:
DE_time FE_time BA_time RPM
Now you can trivially access your data using indexing and fieldnames. For example, the second file:
S(2).name
ans = 'B007 1.mat'
D(2).DE_time
ans = 121410×1
-0.0721 0.3031 0.0331 -0.2073 0.0970 0.1745 -0.0869 -0.0551 0.1309 0.0044
D(2).RPM
ans = 1772
  댓글 수: 2
Rajeev Kumar
Rajeev Kumar 2023년 2월 8일
Thanks for sharing the code, we have to store the subfile from the main .mat file in a seperate .mat file with the name of 'main_file_name_DE.mat.'
Mathieu NOE
Mathieu NOE 2023년 2월 9일
it's quite a bit unclear to me
seems that for the time being you have posted two data (mat) files .
what do you mean by "main" mat file and subfile ? the two provided files do not seems to have nay hierarchical relationship ... or am I wrong ?

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

추가 답변 (3개)

Sarvesh Kale
Sarvesh Kale 2023년 2월 7일
As per my understanding you are trying to import a MAT file which has multiple data inside it, you can use the following script
function importfile(fileToRead1)
newData1 = load('-mat', fileToRead1);
% Create new variables in the base workspace from those fields.
vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
Save the above code as a file named importfile.m
Now you should place your MAT files in the same location as this importfile.m script, then simply do the following
importfile('B007 1.mat'); % will load everything inside the mat file
importfile('B007 0.mat'); % same as above
This will load the data in the MATLAB workspace, I hope this answers your queries, please accept the answer if it does.
Thank you
  댓글 수: 3
Stephen23
Stephen23 2023년 2월 7일
편집: Stephen23 2023년 2월 7일
@Mathieu NOE: The author of this code also does not deal with the inevitable mess of variables that the OP will then have in their workspace... showing that once again, magical variable names just cause more problems.
Sadly there seems to be no requirement for TMW staff to learn or recommend efficient or robust MATLAB programming. At the bare minimum, some links to the MATLAB documentation would be helpful:
"Assigning to variables in the caller workspace can make code more difficult to understand, give surprising results to the user (unexpected or redefined variables in their workspace), and have a negative performance impact. The best practice is to have the function return the variables as output arguments."
Sarvesh Kale
Sarvesh Kale 2023년 2월 7일
I appreciate @Stephen23 for recommending good MATLAB practices and a descriptive answer, I will try to follow them. I am also learning and growing my MATLAB knowledge everyday ! thanks to people like you.

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


Mathieu NOE
Mathieu NOE 2023년 2월 7일
hello
I suspect you wante to store the data in a cell array (and not a regular numeric array)
so try this :
matData = 1×2 cell array
{1×1 struct} {1×1 struct}
>> matData{:} struct with fields:
X118_DE_time: [122571×1 double]
X118_FE_time: [122571×1 double]
X118_BA_time: [122571×1 double]
X118RPM: 1796
struct with fields:
X119_DE_time: [121410×1 double]
X119_FE_time: [121410×1 double]
X119_BA_time: [121410×1 double]
X119RPM: 1772
myFolder = 'C:\Users\IIR\Documents\Machine data\12K Drive End Bearing Dataset'; % Define your working folder
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
filePattern = fullfile(myFolder, '*.mat');
matFiles = dir(filePattern);
for k = 1:length(matFiles)
baseFileName = matFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
matData{k} = load(fullFileName); % <= here my mod
end

Sai Sumanth Korthiwada
Sai Sumanth Korthiwada 2023년 2월 7일
Hi Rajeev Kumar,
I understand that you wanted to load multiple '.mat' files which are having subfile in '.mat' format using the loop. To achieve this, please prefer using 'cell array' instead of 'struct'. The error is due to inconsistent sizes of the fileds in the stuct 'matData'.
Please refer to the modified code, where 'matData' is defined as 'cell array' and fields are added into the 'cell array'.
myFolder = 'C:\Users\skorthiw\Downloads\test'; % Define your working folder
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
filePattern = fullfile(myFolder, '*.mat');
matFiles = dir(filePattern);
matData = {}; % cell array
for k = 1:length(matFiles)
baseFileName = matFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
matData(k) = {load(fullFileName)}; % data added into cell array
end
%% to access the data in the cell array:
matData{1}.X118_BA_time;
matData{2}.X119_FE_time;
Please refer to Cell Array and Accessing Data in Cell Array for more information.
Hope this helps.

카테고리

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

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by