如何使用指定的字符串顺序从单元格数组中进行索引?

时间:2019-06-16 14:48:31

标签: string matlab indexing

我正在尝试从一个可能包含多个参考文件的单元格中进行索引,以进行比较。比较文件的文件名中有不同的部分,我想用它们来指定单个参考文件。 但是,我只能以任何顺序返回包含三个不同部分的参考文件。如何执行命令?

示例:

比较文件为:

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通话中强制执行订单?

谢谢!

1 个答案:

答案 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));