Как я могу использовать указанный порядок строк для индексации из массива ячеек? - PullRequest
2 голосов
/ 16 июня 2019

Я пытаюсь индексировать из ячейки множество потенциальных эталонных файлов, которые можно использовать для сравнения.В файлах сравнения есть отдельные части имен файлов, которые я хотел бы использовать для указания одного ссылочного файла.Однако я могу вернуть только справочные файлы, которые содержат три отдельные части, в любом порядке.Как применить порядок?

Пример:

Файл сравнения:

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_00w20 * 1010второе в правильном порядке.

Можно ли как-то принудительно навести порядок в моем out вызове?

Спасибо!

1 Ответ

1 голос
/ 16 июня 2019

В простейшем случае, когда файлы сравнения и справочные файлы отличаются только в первой части, вы можете использовать strrep:

refFile = strrep(deg_baseFileName, 'Test1', 'Ref');

Если вы знаете, какими будут другие части имени файла, и они одинаковы для всех справочных файлов, но отличаются от файла сравнения, вы можете просто использовать sprintf для создания имя файла:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...