Seeking a little clarification on using sprintf with %d and formatSpec etc. to load similar *.MAT filenames that only differ in name by number.
19 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Peter Beringer
am 25 Okt. 2020
Kommentiert: Peter Beringer
am 25 Okt. 2020
Hi,
I have previously written code to successfully load multiple *.MAT files from the directory that were named "Position01.mat ... Position10.mat" using ..
NumFiles = 10;
AudioCell = cell(2, NumFiles);
for k = 1: NumFiles;
Position = sprintf('Position%02d.mat', k);
AudioCell{1,k} = importdata(Position);
AudioCell{2,k} = Position;
end
I want to do the same for a group of files named "Band200Hz.mat", "Band400Hz.mat" ... by octave band to ... "Band12000Hz.mat" and I've tried to specify the filename format in a few different ways, but not been able to find the symbol(s) that works. The documentation on format specifiers isn't necessarly too clear or easy to understand for me. I think the biggest complication I (think I) face is that there isn't a ocnsistent number of different digits in each file; i.e., some have 3, like 'Band400Hz.mat' up to five as with 'Band20000Hz', so can't specify in a similar way to the first example by simply adding 'Hz' to the end, after the number specifier. Thusly ...
NumBands = 8;
MasterCell = cell(2, NumBands);
for k = 1 : NumBands
Band = sprintf('Band%02dHz.mat', k);
MasterCell{1,k} = importdata(Band);
MasterCell{2,k} = Band;
end
A "brute force" workaround would be to put the octave band filtered signal *.MAT files into their own directory and use ...
dir('*.mat')
But I'd prefer to avoid that.
Any help or helpful links regarding this kind of format specification would be greatly appreciated. If there are any entirely different approaches, I'm interested to find out about those too. Thanks a lot!
0 Kommentare
Akzeptierte Antwort
per isakson
am 25 Okt. 2020
Bearbeitet: per isakson
am 25 Okt. 2020
Less brute
sad = dir( fullfile( root_folder, '**', 'Band*Hz.mat') );
However, this assumes that you want to read all files under the root, which matches the pattern.
Or your approach
for k = 1 : [ 2.^[1:8]*100] % by octave band
sprintf('Band%dHz.mat', k);
...
'Band20000Hz' is not in my sequence, but should it be?
Then I would use load() rather than importdata() (?)
EDIT:
With names like "Band3150Hz.mat" and "Band20000Hz.mat" use
for k = 1 : [200,400,..,3150,20000]
4 Kommentare
per isakson
am 25 Okt. 2020
Bearbeitet: per isakson
am 25 Okt. 2020
Maybe, we should honor Stephen's advice
k = [200,400,800,1600,3150,6300,12500,20000];
MasterCell = cell(2,numel(k));
for jj = 1 : numel(k)
Band = sprintf('Band%dHz.mat', k(jj));
MasterCell{1,jj} = importdata(Band);
MasterCell{2,jj} = Band;
end
This script must be run in the folder of the mat-files.
"but was unable to load any files" What happend, any error message? Hard for us to guess!
"obvious mistake" Your script will create a huge cell array, MasterCell, with the size 2x20000. That counts as a mistake.
Weitere Antworten (1)
Asad (Mehrzad) Khoddam
am 25 Okt. 2020
you can use:
sprintf('Band%dHz.mat', k*200);
6 Kommentare
per isakson
am 25 Okt. 2020
Add the line
assert( isfile(Band), 'Cannot find: "%s"', Band )
before importdata().
Siehe auch
Kategorien
Mehr zu Data Import and Analysis finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!