QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3081|回复: 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
    由来:. y! m2 L% Y' K# ]) z. ?  S
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是7 Z/ q  n$ {1 S4 d( J/ S
    1.jpg
    , y" ]5 Y$ b- R10.jpg
    7 ~$ a( O8 o3 m/ Q) E: u: q  U2 c& K100.jpg7 G& R2 C6 C+ ^" o# T8 h
    101.jpg
    7 @6 y7 t' ~$ K6 A  }2 \* y就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。& {- ]) B0 y2 w

    " i* S/ `. O/ I2 C0 U# @当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。' i3 y* i, O8 V) _- R
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。4 L0 A' E$ k% D3 u
    如果不是上面两种情况的话,本文就是实现从小到大排序。% H9 V4 f7 @+ D- x
    ! ^( h5 J* I/ q9 Q& ~1 z" w- r

    + \( Q( _1 N7 l( l( l提示1:文件名的获取2 \: r9 X/ Z' p+ s* I  G3 I7 O
    通过dir可以得到目录下的文件名,比如:
    ) `8 J/ Y/ K6 s# }: e5 ^' \jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    ) e# B1 r$ p+ d( Gfilename=str2mat(jpgfile.name);  
    ; y5 p# j* h4 x/ u$ u1 Y" @- L, P2 s) q% f
    提示2:字符串数组
    * g7 i1 m* L; U+ [0 v' F先试一下:
    ; m' e  i% b) F; |( Kstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同2 Z8 \6 M: d/ Y' u+ w) `
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    6 m" a4 A6 x" k* g+ h$ ^, k1 Gstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    , E8 H2 d0 x% |; \4 Z  Q) a; |2 L
    * s: [& r9 C  B! U# M这样就导致上面得到的filename每行的长度都相同。
    - M7 s* t+ Z0 l. ^; a3 ]3 p) R9 K& B0 T6 J  q
    ' k' [6 K# y6 @+ ^: M1 _
    本文原理:' p# O/ a0 j; ]) I! C( b5 D
    先判断每行最后面有多少个空格,+ P5 ~) B$ D) \( \( R
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串4 W- }/ l% [. m* k+ @8 S2 Y1 e- _  z, R2 T
    这样排序就可以实现上述的文件名排序功能。/ w- t+ N2 s4 E

    $ `6 L, S" x! M
    ) ^0 V/ c* A( k6 B4 T! \本文代码:
    3 w" `: _( Y0 M3 _' O# l" ^function varargout=LengthSortStr(str)
    - [, a6 t6 o6 x, J$ N: V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; c  E8 R6 D" X3 x
    %Argment:                str文件名组成的字符串数组
    : b" `) H7 B5 E2 s! j- u0 J3 Q$ n5 q%        :                输出参数同sort函数
    7 L. [7 S6 j+ U: q4 j9 w& \3 G%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    . @$ {+ w; q$ ych_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    & E5 _% k8 D* [: y, T! u' U' ]- n- Y, p1 T+ ~  A
    [N,MAXLEN]=size(str);        %个数以及每行的长度
    2 r. O% g! S* |' a9 y. O5 x2 cnewname=[''];
    ) r+ n; u# e/ @: H3 c; U$ s3 x: d1 [5 E( E- F$ i* l* v8 u4 _  c
    for i=1:N
    " U; a" r' n$ I, P# L5 T" f; K4 R; n  k        BlackSpace=0;
    ; X4 z' ^, F, ^& L3 }6 }. G        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    # b" C8 B" y/ `/ Z9 h6 H8 l& L* `                BlackSpace=BlackSpace+1;
    " |' c; J" P) B+ S# {) M        end1 r+ ?$ H0 X9 U, y4 p
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    . V7 R- m# h3 I& U# M        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    7 _- B9 U$ l2 C- k2 b( s9 vend8 b$ L) a9 d6 N5 R
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号3 Y9 K: h0 K, g
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    * U( ?% V0 k5 c# d1 A8 h/ C$ E& E" }8 i- c3 Z9 R# F
    if nargout<=1  V) @% |1 d( T
            varargout{1}=sortstr;
    ! m1 w# h' C. Q, L6 zelseif nargout==2
    8 ~5 Q/ L0 p7 l* Q) M( _: a" g        varargout{1}=sortstr;; v# u! G$ p! q% _; M# O( A
            varargout{2}=order;
      h+ ~' V* d# N/ Y) Mend
    " D7 b3 v& p) E0 j$ ]  X# ^7 L复制代码1 \& F  G: e" i" M( y% ~
    实例:! z$ g- A& t$ X$ m& y
    %对D盘下面的bmp图的文件名进行排序5 V/ p6 M% t" H* v
    clear4 i1 O" p6 X4 t
    dirpath='d:\';                %路径" T. K3 D3 ]2 ]0 `' Y
    extname='bmp';                %扩展名
      x( T: p! p+ [9 V5 a7 G* k
    , P8 p& L" n! H3 C+ lif dirpath(end)~='\'                %如果路径后面没有加\,添加
    - l- l0 s& f/ c! W2 X! W+ {8 c        dirpath=[dirpath,'\'];
    + Z* Y0 @' c0 z8 v8 r5 N, qend
    # l9 y3 o  k9 s' x& R- M" c
    " c) n. y! ?" `5 o& g%先取出目录下的文件信息
    ! `' P+ A0 U* C! S/ X5 p, hpic=dir([dirpath,'*.',extname]);
    6 U% |7 {0 z( e* X" y5 P4 Lfilename=str2mat(pic.name); %取得文件名
    & ]1 P- @& P# i& e4 q' S: h8 Z6 z2 J# Y
    %调用函数
    4 |9 e0 ^+ r" _3 tsortfile=LengthSortStr(filename)
    ' X$ _' ^8 [( N4 j复制代码
    ! @& y  Q' u7 r4 H  V1 a: F# J2 D8 }
    1 f2 @" V+ ]7 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-4-13 16:15 , Processed in 0.455433 second(s), 62 queries .

    回顶部