2016-12-20 2 views
0

Я использую эту строку, чтобы прочитать все изображения в файле:Группировка имен файлов в кластерах

imagefiles = dir('Images\*.jpg'); 

Предположим, у меня есть имена: a1.jpg, a11.jpg, b13.JPG, b5.JPG, c1.jpg.

Как объединить все изображения с не более чем двумя разными символами (числом) на их имя. для данного примера группа вместе все a и все b и аэродромная группа для c.

По группировке Я имею в виду форму какой-либо структуры данных или порядка, которые позволят мне получить доступ к каждой группе отдельно для последующей обработки?

Я предполагаю, что тип файла всегда «jpg», а числа всегда будут меньше 100 и положительны. Я предполагаю нечувствительный к регистру код типа файла, то есть jpg и JPG может отображаться (я не знаю регулярного выражения, но буду рад узнать и о хорошей ссылке)

+0

Я не понимаю, что означает, что ваши критерии группировки. – excaza

+0

Каким будет ваш ожидаемый результат группировки? – lucianopaz

+0

Я попытался отредактировать его до более четкой версии. Это достаточно хорошо? – havakok

ответ

3

Вы можете записать начальную, -number часть имени файла, используя regexp, сгруппируйте их с помощью unique и поместите их в структуру.

% Some test data 
files = {'a11','a1','b2','a32','ca3','b45','c1','ca2'}; 
files = strcat(files, '.jpg'); 

% Capture and group 
tag = regexp(files,'^\D+','match','once'); 
[unTag, ~, unIdx] = unique(tag); 
for idx = 1:length(unTag) 
    fileGroups.(unTag{idx}) = files(unIdx == idx); 
end 

% The result 
>> fileGroups = 
    a: {'a11.jpg' 'a1.jpg' 'a32.jpg'} 
    b: {'b2.jpg' 'b45.jpg'} 
    c: {'c1.jpg'} 
    ca: {'ca3.jpg' 'ca2.jpg'} 

В зависимости от того, как ваши имена файлов могут быть обновлены до более подробного регулярного выражения. Вы можете использовать \D+(?=\d+\.(JPG|jpg)) для наложения символа без цифр перед некоторым номером и расширением .jpg.

Так что, если ваши имена файлов что-то вроде:

>> files 
    'dummyStr_a11.jpg' 
    'dummyStr_a1.jpg' 
    'dummyStr_b2.jpg' 
    'dummyStr_a32.jpg' 
    'dummyStr_ca3.jpg' 
    'dummyStr_b45.jpg' 
    'dummyStr_c1.jpg' 
    'dummyStr_ca2.jpg' 

Захват с чем-то вроде

tag = regexp(files,'[a-z]+(?=\d+\.(JPG|jpg))','match','once'); 
>> tag = 
'a' 'a' 'b' 'a' 'ca' 'b' 'c' 'ca' 
+0

Очень информативный. Большое спасибо. что означает '~' в '[unTag, ~, unIdx]'? что вы не сохраняете эти данные? – havakok

+1

@havakok Да, ~ говорит Matlab игнорировать этот вывод. Это было введено в R2009b (http://blogs.mathworks.com/loren/2009/09/11/matlab-release-2009b-best-new-feature-or/). Подробнее об этом читайте здесь (https://se.mathworks.com/help/matlab/matlab_prog/ignore-function-outputs.html). – NLindros

Смежные вопросы