按文件名中的数字顺序读取文件

时间:2014-10-20 00:04:09

标签: regex string matlab text-processing

我有一些我想要加载和处理的图像。图像的命名如下:image1.jpgimage2.jpgimage3.jpg等。当我处理每个图像时,我想将输出存储在一个数组中。重要的是此数组中的索引对应于图像名称。例如,数组元素5中的值应与image5.jpg对应。

问题在于,当我搜索这些文件并加载它们时,它们严格按字母顺序加载,而不是数字加载。所以,因为我有一个hunder图像,所以要加载的前几个是:image1.jpgimage10.jpgimage100.jpgimage101.jpgimage102.jpg等等上。因此,数组元素5将对应image102.jpg

我的问题是:如何按文件名中的数字顺序加载文件,而不是默认排序?

以下是获取文件名的代码:

my_dir = dir('C:/MyDir');
image_files = {my_dir(~[my_dir.isdir]).name};
disp(image_files);

给出了输出:

'image1.jpg'    'image10.jpg'    'image100.jpg'    'image101.jpg'    'image102.jpg'   .....

2 个答案:

答案 0 :(得分:3)

regexp也完成了工作:

C = regexp(image_files,'image(\d*).jpg','tokens','once');
[~,inds] = sort(str2double([C{:}]))
image_files_sorted = image_files(inds)

答案 1 :(得分:2)

对单元格数组image_files进行排序:

  1. 只保留每个字符串中只包含数字
  2. 的部分
  3. 将其转换为数字
  4. 对所有这些数字进行排序并获取排序索引
  5. 使用该索引对原始单元格数组进行排序。
  6. 代码:

    image_files =  {'image1.jpg' 'image10.jpg' 'image100.jpg' 'image2.jpg' 'image20.jpg'};
    [~, ind] = sort(cellfun(@(c) str2num(c(6:end-4)), image_files))
    image_files_sorted = image_files(ind);
    

    结果:

    image_files_sorted = 
        'image1.jpg'    'image2.jpg'    'image10.jpg'    'image20.jpg'    'image100.jpg'
    
相关问题