zoukankan      html  css  js  c++  java
  • matlab对文件目录进行自然排序

    作者:tongqingliu
    转载请注明出处:http://www.cnblogs.com/liutongqing/p/7072878.html

    觉得有帮助?欢迎来打赏

    # matlab对文件目录进行自然排序 [原博客阅读效果更佳。](http://www.cnblogs.com/liutongqing/p/7072878.html) 比如我新建一个tmp文件夹,在该文件夹下新建以下txt文件进行测试 ``` a1.txt a2.txt a3.txt a11.txt a12.txt b10.txt ``` 返回到tmp的上一层文件夹,编写代码,查看该文件夹下的所有文件。 ```matlab clear;clc;close all d = dir('tmp'); for i = 3:length(d) disp(d(i).name) end ``` MATLAB返回的结果是 ``` a1.txt a11.txt a12.txt a2.txt a3.txt b10.txt ``` WTF,什么鬼,有些时候我们不希望得到这样的结果,吓得我赶紧百度了一下 http://blog.csdn.net/g0m3e/article/details/52982737 看到这个人的博客,实现了我想要的结果,但是链接挂掉了。

    换个地,找到了解决办法。

    新建函数sort_nat.m

    function [cs,index] = sort_nat(c,mode)
    %sort_nat: Natural order sort of cell array of strings.
    % usage:  [S,INDEX] = sort_nat(C)
    %
    % where,
    %    C is a cell array (vector) of strings to be sorted.
    %    S is C, sorted in natural order.
    %    INDEX is the sort order such that S = C(INDEX);
    %
    % Natural order sorting sorts strings containing digits in a way such that
    % the numerical value of the digits is taken into account.  It is
    % especially useful for sorting file names containing index numbers with
    % different numbers of digits.  Often, people will use leading zeros to get
    % the right sort order, but with this function you don't have to do that.
    % For example, if C = {'file1.txt','file2.txt','file10.txt'}, a normal sort
    % will give you
    %
    %       {'file1.txt'  'file10.txt'  'file2.txt'}
    %
    % whereas, sort_nat will give you
    %
    %       {'file1.txt'  'file2.txt'  'file10.txt'}
    %
    % See also: sort
    
    % Version: 1.4, 22 January 2011
    % Author:  Douglas M. Schwarz
    % Email:   dmschwarz=ieee*org, dmschwarz=urgrad*rochester*edu
    % Real_email = regexprep(Email,{'=','*'},{'@','.'})
    
    
    % Set default value for mode if necessary.
    if nargin < 2
    	mode = 'ascend';
    end
    
    % Make sure mode is either 'ascend' or 'descend'.
    modes = strcmpi(mode,{'ascend','descend'});
    is_descend = modes(2);
    if ~any(modes)
    	error('sort_nat:sortDirection',...
    		'sorting direction must be ''ascend'' or ''descend''.')
    end
    
    % Replace runs of digits with '0'.
    c2 = regexprep(c,'d+','0');
    
    % Compute char version of c2 and locations of zeros.
    s1 = char(c2);
    z = s1 == '0';
    
    % Extract the runs of digits and their start and end indices.
    [digruns,first,last] = regexp(c,'d+','match','start','end');
    
    % Create matrix of numerical values of runs of digits and a matrix of the
    % number of digits in each run.
    num_str = length(c);
    max_len = size(s1,2);
    num_val = NaN(num_str,max_len);
    num_dig = NaN(num_str,max_len);
    for i = 1:num_str
    	num_val(i,z(i,:)) = sscanf(sprintf('%s ',digruns{i}{:}),'%f');
    	num_dig(i,z(i,:)) = last{i} - first{i} + 1;
    end
    
    % Find columns that have at least one non-NaN.  Make sure activecols is a
    % 1-by-n vector even if n = 0.
    activecols = reshape(find(~all(isnan(num_val))),1,[]);
    n = length(activecols);
    
    % Compute which columns in the composite matrix get the numbers.
    numcols = activecols + (1:2:2*n);
    
    % Compute which columns in the composite matrix get the number of digits.
    ndigcols = numcols + 1;
    
    % Compute which columns in the composite matrix get chars.
    charcols = true(1,max_len + 2*n);
    charcols(numcols) = false;
    charcols(ndigcols) = false;
    
    % Create and fill composite matrix, comp.
    comp = zeros(num_str,max_len + 2*n);
    comp(:,charcols) = double(s1);
    comp(:,numcols) = num_val(:,activecols);
    comp(:,ndigcols) = num_dig(:,activecols);
    
    % Sort rows of composite matrix and use index to sort c in ascending or
    % descending order, depending on mode.
    [unused,index] = sortrows(comp);
    if is_descend
    	index = index(end:-1:1);
    end
    index = reshape(index,size(c));
    cs = c(index);
    

    调用这个函数,在之前的代码中添加几行

    clear;clc;close all
    d = dir('tmp');
    nameCell = cell(length(d)-2,1);
    for i = 3:length(d)
        disp(d(i).name)
        nameCell{i-2} = d(i).name;
    end
    d2 = sort_nat(nameCell)
    

    下面是见证奇迹的时刻

    d2 = 
        'a1.txt'
        'a2.txt'
        'a3.txt'
        'a11.txt'
        'a12.txt'
        'b10.txt'
    

    这样就方便处理文件了。

    参考:

    http://cn.mathworks.com/matlabcentral/fileexchange/34464-customizable-natural-order-sort

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/liutongqing/p/7072878.html
Copyright © 2011-2022 走看看