在群集

时间:2016-12-20 09:19:58

标签: matlab data-structures

我正在使用此行读取文件中的所有图像:

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

假设我有名字:a1.jpga11.jpgb13.JPGb5.JPGc1.jpg

如何将名称中不超过2个不同字符(数字)的所有图像组合在一起。对于给定示例组,所有a和所有b以及c的atheired组。

通过分组,我的意思是形成某种数据结构或顺序,使我能够分别访问每个组以便以后处理?

我假设文件类型总是'jpg',数字总是小于100且为正数。我假设一个不区分大小写的文件类型代码,jpgJPG可能会出现(我不知道正则表达式,但也很乐意从一个好的链接中学习)

1 个答案:

答案 0 :(得分:3)

您可以使用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'