我正在尝试从一个可能包含多个参考文件的单元格中进行索引,以进行比较。比较文件的文件名中有不同的部分,我想用它们来指定单个参考文件。 但是,我只能以任何顺序返回包含三个不同部分的参考文件。如何执行命令?
示例:
比较文件为:
deg_baseFileName = "Test1_female_44k_70dBA_babble7ch_1sp_20k_00dBA_48k"
我使用strsplit将文件名分成几部分:
deg_parts = strsplit(deg_baseFileName, "_");
区别部分是:
deg_parts(2), deg_parts(4), deg_parts(8)
在这种情况下:“女性”,“ 70dBA”,“ 00dBA”-按该顺序。
我使用这些功能来识别和索引不同的部分:
strToFind = {string(deg_parts(2)),string(deg_parts(4)),string(deg_parts(8))}'; % Strings to match
fun = @(s)~cellfun('isempty',strfind(ref_files,s));
out = cellfun(fun,strToFind,'UniformOutput',false);
idx = all(horzcat(out{:}),2);
但是,索引从我的参考文件单元格数组返回两个值: Ref_female_44k_00dBA_babble7ch_1sp_20k_70dBA_48k.wav Ref_female_44k_70dBA_babble7ch_1sp_20k_00dBA_48k.wav
两者都包含区别部分,但只有第二部分以正确的顺序显示。
有没有办法在我的out
通话中强制执行订单?
谢谢!
答案 0 :(得分:1)
在最简单的情况下,比较文件和参考文件的第一部分只是不同,您可以使用strrep
:
refFile = strrep(deg_baseFileName, 'Test1', 'Ref');
如果您知道文件名的其他部分是什么,并且所有参考文件的其他部分都相同,但与比较文件不同,则可以使用sprintf
创建文件名:< / p>
refFile = sprintf('Ref_%s_44k_%s_babble7ch_1sp_20k_%s_48k.wav', ...
deg_parts(2), deg_parts(4), deg_parts(8));
如果您不知道或不在乎其他部分,可以对上述内容进行概括,以创建一个与regexp
配合使用的匹配表达式,以找到正确顺序的参考文件的索引:>
expr = sprintf('Ref_%s_[^_]+_%s_[^_]+_[^_]+_[^_]+_%s_[^_]+.wav', ...
deg_parts(2), deg_parts(4), deg_parts(8));
index = ~cellfun('isempty', regexp(ref_files, expr));