QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3155|回复: 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
    由来:
    * h3 X% h) x! X. F5 d7 N手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    1 p" p$ U% o' M0 Y3 G% I: n$ c1.jpg, G; ?0 i+ \/ W  I- R  x
    10.jpg
    - A2 }  F( P7 j$ a0 e100.jpg
    ) a* C: a" `0 H+ H% \2 b101.jpg
    * Y- |) p2 i( q8 N就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    ) a2 o) m* c' O, z7 `# p
    # V. A9 \/ a; [" f" ]2 x! S- A当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    " a: [" l. q3 ]/ s# X$ _+ G当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。( J2 m3 O( c; P7 l% T/ k
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    + D% [' E# a4 w8 x" m9 p, w: ?7 j0 k7 z. j8 C

    0 E9 B& d6 ]/ ], [提示1:文件名的获取
    * x, L# n" y  P& g+ z: p( Z3 E通过dir可以得到目录下的文件名,比如:& \/ Q1 E% k* J4 u. {& Q- w
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    $ u4 X5 e2 d" _; Y9 Yfilename=str2mat(jpgfile.name);  ) Q# C1 k& y7 S$ |* I) G8 a

    8 m3 ~9 s5 _2 A提示2:字符串数组
    0 w6 a* b# q% v" q先试一下:
    ; _  Q/ O- c1 Q" ]  _7 p9 [str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    1 e2 @6 R1 h! h% Cstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    : a( t) P/ [0 A, h; Astr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    ' Q( `" B+ R0 ?5 \# p" J7 r( F( ?$ s) s) W1 `# n9 a9 K
    这样就导致上面得到的filename每行的长度都相同。7 c" o% ^& U7 _

    . @9 Q8 \- [+ K6 z) z" Y: [  }* ^
    本文原理:# ]8 x& Z" J- I- W  D% [0 X
    先判断每行最后面有多少个空格,
      e( p3 W6 @* B: {$ L$ F然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    - N$ m8 T) Z( ^( f5 j. U这样排序就可以实现上述的文件名排序功能。
    8 [& D$ ~6 m7 C9 Y2 [% a% Y4 C: r
    ( d; H: X/ d( b4 N" \* ?8 e: F' C& U3 x0 N# }# ]
    本文代码:( ?+ n4 `' o8 P- |7 R) B( t
    function varargout=LengthSortStr(str)
    - P0 \7 l, o0 _! I1 Q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    5 M1 `- g( ?+ u5 M, t%Argment:                str文件名组成的字符串数组
    ) L" {! w1 f7 l$ _%        :                输出参数同sort函数
    2 H0 p" E- ~4 M8 B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    / F  q, Z- ~% V: b4 m3 [2 b; Qch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    0 B* I" q9 Q' e0 T' Y; @
    # i0 z7 e6 `4 [) J/ n  K- Q[N,MAXLEN]=size(str);        %个数以及每行的长度$ w% M& G3 n$ T& p/ l
    newname=[''];
    5 x, T8 ~5 c$ t" v) r7 M2 i* m
    5 F3 G! v! j# g# `for i=1:N/ g( e/ \# _5 Z( r5 c8 q
            BlackSpace=0;
    " x5 g% d& O  [3 j* K        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格3 ]7 X: h7 B7 N# }
                    BlackSpace=BlackSpace+1;
    ( h! _6 T3 x3 W) _        end# [1 _9 L2 N; w. V" [" L
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格3 S3 e3 o. J  Q5 y$ ?" ^
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    8 @  P2 ]2 \2 Oend% }+ U; b6 N: X" ^6 y: H% K
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    ( E& d5 W( s" x3 e! W/ a+ qsortstr=str(order,;                                %由这个序号生成原始的排序名- Q% L' y8 f" J1 }+ d) M
    6 Z& `% p( M% ~6 X  v$ F- J
    if nargout<=1* H  h# @8 E1 M0 C7 f- E7 I. S
            varargout{1}=sortstr;6 g1 k' @7 X  j2 x/ W  h
    elseif nargout==2& s2 [# k) [: m) R! ?& b9 b
            varargout{1}=sortstr;0 N. q2 V) L' D) }2 g& ~5 K. F
            varargout{2}=order;: G. R0 E9 D5 Q4 [9 W
    end
    4 f1 f! J( Z9 [# |9 {0 W) r) w( r复制代码
    ( R# h0 z5 V, t/ _4 S9 i实例:
    7 I; d; j4 v& k1 `# z9 h, V. c+ m5 F%对D盘下面的bmp图的文件名进行排序; ^7 a+ H% Z& |9 @  N9 O
    clear- X1 @' s) b4 i5 R2 L7 t9 B4 I
    dirpath='d:\';                %路径) k6 \  p( d; C' G
    extname='bmp';                %扩展名
    $ D% ^! ~3 T  R4 D/ @/ \# s3 _% ?- ?$ L+ Y
    if dirpath(end)~='\'                %如果路径后面没有加\,添加3 D' g+ _/ }3 R8 Q$ N% c$ h" F
            dirpath=[dirpath,'\'];; L) ^6 @5 I) @% ]
    end
    ; a+ T0 e8 g4 C* G& X
    + x" r8 x) y& j%先取出目录下的文件信息" T) b6 [. v! w# p
    pic=dir([dirpath,'*.',extname]);; J/ N7 j. |$ b( R' ~
    filename=str2mat(pic.name); %取得文件名2 Y  s/ H! y( @: G$ g0 G5 c$ y

    : s1 ^% a, X" \* m/ N  l9 H%调用函数  V$ @6 j- Z, ^' |+ |
    sortfile=LengthSortStr(filename)
    4 W  |4 Z' B- G+ x7 E* E3 D! E7 X) Z复制代码" O9 h1 @. S8 K( R
    5 i9 d# }, N! B8 g0 N. p
    6 ^) _; \( K, W  t8 c$ M/ F/ ]
    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-7-29 21:38 , Processed in 0.345715 second(s), 62 queries .

    回顶部