QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3132|回复: 2
打印 上一主题 下一主题

[其他资源] 文件名排序Matlab程序

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2015-1-20 13:56 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    由来:0 b. x; R/ H; d* o5 B! \0 A* j
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是' N( p4 H; h* m+ e+ O
    1.jpg* l. R8 \5 o; ~# t/ S( G! P
    10.jpg
    : m5 q7 V/ i& X; |100.jpg
    ) N& y4 q) W. n" _  F8 j3 J2 L+ P101.jpg( E" k8 g- r- P, K
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    $ V, U# C/ O2 @  N
    + a8 F( A  k6 \3 u8 ?" ?当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    " I4 B' z' _* I: E当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# k, R! e* `4 i9 N( x& D' B4 H
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    & e+ C: H+ G& a0 [! @. e+ {( p9 j, g' B; V1 J' K; B4 b, ]" q
    % h! p7 y# R" w/ c1 H
    提示1:文件名的获取! D$ H; k1 g+ y; E! j% j# `. i! F
    通过dir可以得到目录下的文件名,比如:+ z! e$ L; X3 l* o& n& J
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    2 ]: j+ H2 z- k$ x2 r% J4 j  ^8 X  yfilename=str2mat(jpgfile.name);  
    3 F2 J% P* X9 q7 R, P8 L  B: f4 D* y6 Y
    提示2:字符串数组
    : s) }1 p6 X, `0 e+ p先试一下:+ X9 f( T1 L! s3 L
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    ! x* C' v2 J' K% F% ostr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    + u, H( q6 U* K+ ystr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    % |- E. d* ^) S! h& o+ v9 Q2 O+ [6 u1 u! Q. N% z1 C
    这样就导致上面得到的filename每行的长度都相同。8 W4 p9 c. T- \7 H- o+ W
    : O* k7 D6 m& ~4 B6 f

    0 M3 j' \; N: w( Q; a5 s: m本文原理:
    ' d' h# m: ~3 d' M8 o: o! _先判断每行最后面有多少个空格,- C( R/ |4 [/ {5 v, W/ ^% a! m
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    / _2 W: ^, H0 _这样排序就可以实现上述的文件名排序功能。
    4 P: Y: e! \; q: m# a/ G" |& Z
    * S. k- L3 I. g# ]8 Q0 R' N9 p" O: B: |2 }7 A
    本文代码:0 z+ {: _6 H2 L3 w! m5 ?, ?$ Z
    function varargout=LengthSortStr(str)
    $ `9 y" b+ y& R' p0 Q1 B. e2 S" ?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- _, Y/ x" X: ?5 m
    %Argment:                str文件名组成的字符串数组% G# r3 @: O7 A* L# _, s
    %        :                输出参数同sort函数
    5 ^- ^; a' }6 ?3 W) J$ [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& C/ K) g3 T3 X9 y# |
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好) g5 o$ p# t0 C. |* ^

    ' \2 B  Y, D8 V8 k[N,MAXLEN]=size(str);        %个数以及每行的长度7 S/ Y& \3 G" a1 X8 u0 ]
    newname=[''];
    " l; R) y) b+ R8 j) ~6 Y, J9 M
    * i& J% E* {8 h# U* F5 [for i=1:N* D6 G" f% T$ g' v6 w, Y6 ^. O
            BlackSpace=0;
    1 m# |, F6 |) Y, Y! ?& o        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格$ G. [5 r7 y3 V; a9 d: f& x0 i7 J
                    BlackSpace=BlackSpace+1;
    + R* G+ l; K) g% f1 d) X7 O( X/ k  g& h6 o        end$ l. j2 T  O/ l! Q. R& Z8 {
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    0 T& {9 v/ B" s7 j4 v1 F        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];3 x, }$ `  n0 ^4 R2 \3 J
    end
    4 D, o1 D0 @1 N9 x) a[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    + N+ h2 U$ Q, p7 O9 T* W! Vsortstr=str(order,;                                %由这个序号生成原始的排序名
    ' h; ~6 `, \5 K5 O% q& \1 M) Y3 @' K
    if nargout<=1
    4 J5 A( V0 i1 X0 B        varargout{1}=sortstr;5 ^, H# I; O6 w6 c3 \8 R* X/ H
    elseif nargout==2
    6 @1 z$ t: N1 ]        varargout{1}=sortstr;
    ! |! H, K  y" u8 R- w; f5 L        varargout{2}=order;' w1 k& Y, _' m" D) D
    end# }$ e/ \2 S* W: P
    复制代码8 B& n+ w% }3 b, k4 z* Y* C
    实例:; e/ Z3 O; g1 C$ q+ [; _  n
    %对D盘下面的bmp图的文件名进行排序+ p0 |; i) I- O& ~' [
    clear
    , C) u. m' `) k/ a$ Wdirpath='d:\';                %路径
    8 d. ?) {8 s) x% {( k3 Q: Fextname='bmp';                %扩展名; k$ |8 z; x$ }& N! u% o
    . m  Y8 m% M2 r1 s
    if dirpath(end)~='\'                %如果路径后面没有加\,添加8 x0 o, ^0 [2 v' S
            dirpath=[dirpath,'\'];
    : j" |2 Q- a' s/ fend
    $ ^7 m* J8 }5 r- u$ e7 i+ C- S" p! O( D8 {, X
    %先取出目录下的文件信息
    ) M8 L8 j! c" G' Npic=dir([dirpath,'*.',extname]);
    8 k9 m2 i/ r8 k/ ?filename=str2mat(pic.name); %取得文件名
    : j  O# |5 j* @. I- h5 k7 G, `" C; t( z! J/ w/ B3 q* l
    %调用函数
    4 e7 \$ o6 r+ E' Gsortfile=LengthSortStr(filename)8 G* C( r4 K/ m; f+ u3 `% y& V- W
    复制代码
    7 J! v+ w3 i& j; C3 x" H# j( K$ o
      H( Q2 o2 M1 ^) y7 v9 X$ ^* v4 M% k' ^8 F4 K6 _6 V( x
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    冻鱼        

    3

    主题

    12

    听众

    147

    积分

    升级  23.5%

  • TA的每日心情
    开心
    2015-2-12 00:09
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    邮箱绑定达人 社区QQ达人

    群组全国大学生数学建模竞

    群组哈尔滨工业大学建模团

    回复

    使用道具 举报

    0

    主题

    12

    听众

    43

    积分

    升级  40%

  • TA的每日心情
    慵懒
    2015-9-7 19:24
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-12 01:42 , Processed in 0.487560 second(s), 61 queries .

    回顶部