MATLAB Answers

Seeking a little clarification on using sprintf with %d and formatSpec etc. to load similar *.MAT filenames that only differ in name by number.

조회 수: 4(최근 30일)
Peter Beringer
Peter Beringer 2020년 10월 25일
댓글: Peter Beringer 2020년 10월 25일
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!

채택된 답변

per isakson
per isakson 2020년 10월 25일
편집: per isakson 2020년 10월 25일
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
Peter Beringer
Peter Beringer 2020년 10월 25일
The error was just that: "Unable to load file" when it got to the first four-digit value.
Thanks for your help.

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

추가 답변(1개)

Asad (Mehrzad)  Khoddam
Asad (Mehrzad) Khoddam 2020년 10월 25일
you can use:
sprintf('Band%dHz.mat', k*200);
  댓글 수: 6
Peter Beringer
Peter Beringer 2020년 10월 25일
Exactly, no integer * 200 will equal 3150, so that's what made me think multiplying k by 200 wouldn't work. Why is that logic flawed? And it didn't work, as soon as it went looking for "Band600Hz.mat", it returned the error "Unable to load file".
Please to see that you're editing insults out of your comments ... you'll get to the level of "civility" soon enough.
Thanks for your help!

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

Community Treasure Hunt

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

Start Hunting!

Translated by