如何强制Matlab连续读取文件夹中的文件?

如何强制Matlab连续读取文件夹中的文件?,matlab,directory,dir,Matlab,Directory,Dir,我的文件夹中的文件编号从writer\u 1到writer\u 20。我编写了一个代码来读取所有文件并将它们存储在单元格中。但问题是这些文件不是连续读取的 folders = dir(Path_training); folders(ismember( {folders.name}, {'.', '..'}) ) = []; %Remove these two from list training = []; for i = 1:length(folders) curren

我的文件夹中的文件编号从
writer\u 1
writer\u 20
。我编写了一个代码来读取所有文件并将它们存储在单元格中。但问题是这些文件不是连续读取的

folders = dir(Path_training);
folders(ismember( {folders.name}, {'.', '..'}) ) = []; %Remove these two from list
training = [];
    for i = 1:length(folders)
        current_folder = [Path_training folders(i).name '\']; 
.
.
.
.
.
这里的
文件夹(1)。name
是writer\u 1,而
文件夹(2)。name
是writer\u 10

我知道
dir
会像浏览器一样返回结果,但是有没有办法强迫它以数字形式返回


我正在根据这些数字训练一个支持向量机,这个问题让它变得很困难。

我不知道有什么直接的解决方案可以解决您的问题。 我找到了一个类似于你的问题的解决方案

区别在于:

  • 您处理的是目录而不是文件
  • 除数字外,您的目录名称中还有其他文本

  • 我不知道有什么直接的方法可以解决你的问题。 我找到了一个类似于你的问题的解决方案

    区别在于:

  • 您处理的是目录而不是文件
  • 除数字外,您的目录名称中还有其他文本
  • 方法#1

    %// From your code
    folders = dir(Path_training);
    folders(ismember( {folders.name}, {'.', '..'}) ) = []
    
    %// Convert folders struct to a cell array with all of the data from dir
    folders_cellarr = struct2cell(folders)
    
    %// Get filenames
    fn = folders_cellarr(1,:)
    
    %// Get numeral part and sorted indices
    num=str2double(cellfun(@(x) strjoin(regexp(x,['\d'],'match'),''), fn(:),'uni',0))
    [~,ind] = sort(num)
    
    %// Re-arrange folders based on the sorted indices
    folders = folders(ind)
    
    方法#2

    如果您想避免使用
    struct2cell
    ,这里有一种替代方法-

    %// Get filenames
    fn = cellstr(ls(Path_training))
    fn(ismember(fn,{'.', '..'}))=[]
    
    %// Get numeral part and sorted indices
    num=str2double(cellfun(@(x) strjoin(regexp(x,['\d'],'match'),''), fn(:),'uni',0))
    [~,ind] = sort(num)
    
    %// List directory and re-arrange the elements based on the sorted indices
    folders = dir(Path_training);
    folders(ismember( {folders.name}, {'.', '..'}) ) = []
    folders = folders(ind)
    
    请注意,是最近添加到MATLAB工具箱中的一个组件。因此,如果您使用的是旧版本的MATLAB,以下是来自MATLAB文件交换的方法。

    方法#1

    %// From your code
    folders = dir(Path_training);
    folders(ismember( {folders.name}, {'.', '..'}) ) = []
    
    %// Convert folders struct to a cell array with all of the data from dir
    folders_cellarr = struct2cell(folders)
    
    %// Get filenames
    fn = folders_cellarr(1,:)
    
    %// Get numeral part and sorted indices
    num=str2double(cellfun(@(x) strjoin(regexp(x,['\d'],'match'),''), fn(:),'uni',0))
    [~,ind] = sort(num)
    
    %// Re-arrange folders based on the sorted indices
    folders = folders(ind)
    
    方法#2

    如果您想避免使用
    struct2cell
    ,这里有一种替代方法-

    %// Get filenames
    fn = cellstr(ls(Path_training))
    fn(ismember(fn,{'.', '..'}))=[]
    
    %// Get numeral part and sorted indices
    num=str2double(cellfun(@(x) strjoin(regexp(x,['\d'],'match'),''), fn(:),'uni',0))
    [~,ind] = sort(num)
    
    %// List directory and re-arrange the elements based on the sorted indices
    folders = dir(Path_training);
    folders(ismember( {folders.name}, {'.', '..'}) ) = []
    folders = folders(ind)
    

    请注意,是最近添加到MATLAB工具箱中的一个组件。因此,如果您使用的是旧版本的MATLAB,这里是来自MATLAB文件交换的文件。

    这里有一种稍微不同的方法(编辑以修复bug并实现@Divakar的建议以消除for循环)


    这里有一个稍微不同的方法(编辑以修复bug并实现@Divakar的建议以消除for循环)


    从DavidS那里偷点东西,假设你的文件夹都是“writer_XX”的形式,XX是数字

    folders = dir([pwd '\temp']);
    folders(ismember( {folders.name}, {'.', '..'}) ) = [];
    
    % extract numbers from cell array
    foldersNumCell = regexp({folders.name}, '\d*', 'match');
    
    % convert from cell array of strings to double
    foldersNumber = str2double(foldersNumCell);
    
    % get sort order
    [garbage,sortI] = sort(foldersNumber);
    
    % rearrange the structure
    folders = folders(sortI);
    

    这样做的优点是避免了for循环。事实上,如果你有成千上万的文件夹,这只会产生不同。(我创建了50000个文件夹,标记为“writer_1”到“writer_50000”。执行时间相差约1.2秒。

    从DavidS那里偷了一点,并假设您的文件夹都是“writer_XX”形式,XX是数字

    folders = dir([pwd '\temp']);
    folders(ismember( {folders.name}, {'.', '..'}) ) = [];
    
    % extract numbers from cell array
    foldersNumCell = regexp({folders.name}, '\d*', 'match');
    
    % convert from cell array of strings to double
    foldersNumber = str2double(foldersNumCell);
    
    % get sort order
    [garbage,sortI] = sort(foldersNumber);
    
    % rearrange the structure
    folders = folders(sortI);
    

    这样做的好处是它避免了for循环。实际上,如果你有成千上万个for文件夹,它只会起作用。(我创建了50000个标记为“writer\u 1”到“writer\u 50000”的文件夹。执行时间的差异约为1.2秒。

    你不能执行
    list=dir(文件夹)
    排序(列表)
    ?那么这将只是所需排序标准的问题。如果您可以重命名文件夹,最简单的解决方案是将它们命名为writer\u 01、writer\u 02…以便它们将自动正确排序。您不需要执行
    list=dir(文件夹)
    排序(列表)
    ?那么这将只是所需排序标准的问题。如果您可以重命名文件夹,最简单的解决方案是将它们命名为writer\u 01、writer\u 02…这样它们将自动正确排序。您不需要
    str2double(vertcat(foldersNumCell{:}))
    而是需要
    str2double(vertcat>(foldersNumCell{:}))