QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3154|回复: 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
    由来:
    1 L2 a4 Q7 b( V1 i手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    ; i6 _1 L# Q$ S, D1 ?1.jpg
    6 [3 h( C) p, z/ z10.jpg
    0 x; D2 G  R, H8 K# B. p100.jpg
    ! F8 i; i6 [9 _5 l8 b( |5 U: Y101.jpg6 Z6 N  x- ^- A/ [# {8 b
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    / [( A, Q/ |$ R) X+ ]4 U% p, A' @  P* F. b. J$ v- d* N( w. z  S
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。7 C( @" x; I7 ?* p) r2 a
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    ; n7 N) L) q/ T2 b  ~( i如果不是上面两种情况的话,本文就是实现从小到大排序。
    " e% ?: Y$ u4 Q3 L' i: s6 V+ p" O6 a) u( J
    1 ]; E* O* A. ?8 j
    提示1:文件名的获取
    . {5 D- }1 h( ^1 v通过dir可以得到目录下的文件名,比如:
    . A4 l1 E+ d+ s' h. g, K8 jjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。- ~6 l1 @7 g3 K- a1 R  b( K( @
    filename=str2mat(jpgfile.name);  7 c4 _8 e/ L: I5 V% X+ K$ P+ j
    6 r0 v% R- k9 @, o
    提示2:字符串数组/ l: A5 B. r$ y9 P0 Y9 O
    先试一下:( V) X2 z' f& x8 O; J
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    ' r; h4 r' j& L& K5 i3 rstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同( ~' m7 z) l- l3 X% e* o3 z
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    - S" n; M1 V8 e4 s. \. ?+ t/ R2 E: r8 |
    这样就导致上面得到的filename每行的长度都相同。
    - J8 J3 Z- w- A0 K5 H3 B- Y! X' S5 p2 m; H9 A4 N

    ' S$ _! C8 @! d& M& }8 t4 U本文原理:2 f) x- I9 w; `, \0 `1 B
    先判断每行最后面有多少个空格,
    8 T1 e/ }6 T' N' G然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串7 Q5 X9 ]' R3 |" P' E) H
    这样排序就可以实现上述的文件名排序功能。
    " d' R+ E2 a% d. Y8 C" r
    2 E) }7 [8 u4 e. n( i) x
    $ `/ o  [/ \8 g/ B- V' g* a本文代码:3 W& x( c7 z7 S3 `" f
    function varargout=LengthSortStr(str)
    * n2 d  a' b4 G  `0 I+ _: m# ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    : L* o% D* p8 o5 E7 f+ ^%Argment:                str文件名组成的字符串数组) I! b6 P' N5 ]. e" B* L1 l
    %        :                输出参数同sort函数
    8 Z9 z- I) Y# r- N4 r4 n+ x0 C3 x( }%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Z! ?' z$ G! W! }. G
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好- U. s5 h7 C6 |4 M

    7 M4 p) }( Q( b# Z/ m[N,MAXLEN]=size(str);        %个数以及每行的长度" W4 F# e/ Q$ Z* a( \% o: D! w3 m9 W
    newname=[''];2 z: R3 `# H8 }4 S: V, [3 F# n

    , J0 ~3 ?( T: L0 y/ t' |for i=1:N
    ) ^5 {0 ?. n% u  T7 R0 W        BlackSpace=0;( R' I. ?; v* }* `4 Q: P( M
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格6 A" ~- l: A) e. ]% L# Z: F( i0 ~
                    BlackSpace=BlackSpace+1;# X% C$ U8 E3 {5 X6 t
            end2 q6 t8 `: ]6 [% g2 l9 w7 _2 }" ]
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格( ~( n8 t3 w2 |3 h6 m6 l! Z
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    7 H6 B& x% P3 h8 L: I. A2 D$ o1 ~$ Hend' H( f+ W! r$ r5 Z" X, l: m- ]/ H
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    4 B/ _; n( E& y' o' d& Asortstr=str(order,;                                %由这个序号生成原始的排序名
    9 l7 K9 F; {( d8 d; A4 d# u3 o+ A0 G) K
    if nargout<=1
    # v( Z: n8 z4 i. T( U0 h4 U        varargout{1}=sortstr;/ h5 l0 O. N4 O0 g1 |
    elseif nargout==2& m. f+ a; h! ~  z: H& f) V
            varargout{1}=sortstr;8 p4 \2 ^: {8 _, A& S" F
            varargout{2}=order;
    9 T9 }! B5 K6 H1 O# d+ mend" f, ^, f+ c9 ^0 b9 C3 Q' u0 l
    复制代码
    3 V) q( {" \$ }( F$ U" i实例:$ J, J( t" V5 ?# p9 \0 d, T
    %对D盘下面的bmp图的文件名进行排序
    1 \$ R! E6 r9 s) j0 b: }  Nclear
    0 x5 x- C- U+ x( I& k7 Vdirpath='d:\';                %路径1 D: U. O" k! j: B  {
    extname='bmp';                %扩展名
    3 t* H1 F# Q6 j! F: _' p6 W' Z/ \$ \3 P! T5 P% N; s2 l
    if dirpath(end)~='\'                %如果路径后面没有加\,添加2 P* J. h9 c) j  p9 }
            dirpath=[dirpath,'\'];
    ; P* L; C$ [4 B0 a9 O7 Oend
    6 Y. R; ]: r  `9 H
      |7 c' i- N3 v9 Z) p/ D/ h& U%先取出目录下的文件信息& |6 C, `; X7 Z3 @8 T& a
    pic=dir([dirpath,'*.',extname]);0 R- \8 V8 E0 S2 g/ w6 G
    filename=str2mat(pic.name); %取得文件名4 w) k9 d# Z. Q5 X$ T1 y

    % y* y  n5 T' e5 l- H6 |! b$ Y%调用函数
    $ p, \4 Y( t6 b8 f/ d* ]  ksortfile=LengthSortStr(filename)
    ( b: w% R, f5 J  O& W% V9 E6 K复制代码6 q8 m# }& N: S7 q' x, H( m. ?, h9 i8 ?
    # R' N# \( |7 `3 i4 \/ `2 z

    . r% s& E! d/ s% u. r. ~
    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 16:42 , Processed in 0.436234 second(s), 61 queries .

    回顶部