QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3137|回复: 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
    由来:
    $ [$ t3 w4 z  B/ J2 D  F( R+ a2 v0 J" a手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是4 J' j9 T9 d7 l& C( H( C. n6 a
    1.jpg+ z) l* m& _) Y  T' Z. m. \
    10.jpg8 s' _5 n' `6 r) x' i& }4 @
    100.jpg$ Z/ B' j& O4 G1 _! h  N1 d
    101.jpg8 N) S4 P$ R/ D7 P  K9 ~
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    % M+ X7 c1 y3 P( `' ^" g+ p! Y
    " p' c7 U" j* J& k% r当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
      v" ^3 b; c8 ?, c% a当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    4 Y& j$ J" _, u7 R4 W+ k: ~" ^3 k如果不是上面两种情况的话,本文就是实现从小到大排序。
    + L2 b8 v6 t4 M" F5 W% G; b9 T6 y3 L0 e0 g2 g
    / C7 t: T2 w/ \8 L3 t" K7 Y; n
    提示1:文件名的获取% Y, T" i: `: ~& r- j  u6 n
    通过dir可以得到目录下的文件名,比如:* n: C+ J- k% z( R. i3 G1 {8 f
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    : H2 I, c' n8 {: Y! a6 n$ Efilename=str2mat(jpgfile.name);  
    " l+ d* A) R7 b' W: q6 F+ O$ ^+ e/ s4 X0 n9 s
    提示2:字符串数组
    & Z* P3 }" S2 @/ S先试一下:
    ! ]- Q' ]) \2 T" s2 Y3 fstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    % [. x, N- n6 e5 ?+ Istr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同% T! ?: ?& ~/ ^; ~( v0 Q
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。1 t' _7 e$ z% |( r

    ' `! ?9 _9 s6 `# V9 g. R这样就导致上面得到的filename每行的长度都相同。7 @' b7 }5 n) t- e8 `, Z8 j

    + ^7 T0 q: f& Z' b( e4 [
    1 U! {8 c1 h& s! P4 b1 @: d本文原理:3 B2 H$ v0 L- A4 N3 ^
    先判断每行最后面有多少个空格,
    $ I2 y7 J3 p7 E) Y& Q然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串( v+ h% ^- n' r4 Z+ z5 Q
    这样排序就可以实现上述的文件名排序功能。# B+ k7 |4 J+ s7 |) B+ G4 d

    ' Q+ @, g/ Z4 _0 v: G
    9 z- S5 d8 Z; j( f本文代码:' |; X4 n. g3 F' G3 ~
    function varargout=LengthSortStr(str)- |9 H' s4 I- b1 W; ?! Z- M, W
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    $ i  v- Q8 o2 A: E  t9 \& k( f3 o%Argment:                str文件名组成的字符串数组& i2 e( L9 F( S7 `
    %        :                输出参数同sort函数  f8 |* i4 O6 M& X" [
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x0 t' K3 X" W1 k+ t6 G
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    ! F/ L3 j" j' A6 C6 c  ^. S$ P$ f6 \# P
    [N,MAXLEN]=size(str);        %个数以及每行的长度: t/ h4 f1 a- x
    newname=[''];( n/ ]# o" j3 Z2 h$ F

    6 M- L& j& T" y4 F( Hfor i=1:N- \8 @0 O! F0 ^9 P+ v
            BlackSpace=0;
    7 u) H; q! }+ {& x2 w" r- x        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    , q* {! M! U. l% L: ~( f; L                BlackSpace=BlackSpace+1;
    7 t  y5 R4 \6 D9 O1 Q8 T( I( U        end# Y$ D6 m- b0 ]: ?
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格& ]% @5 o4 r+ E+ R4 h6 [
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];3 m! A+ w  C8 Y7 x7 O8 V6 c
    end
    1 M( c5 C7 W1 E- J+ Q[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    / N8 c2 l8 K" @5 a# W& P6 s2 e: usortstr=str(order,;                                %由这个序号生成原始的排序名' b3 U9 P+ `1 G: V2 F
      }3 F1 ~" d% Y" Z
    if nargout<=1
    . r2 S4 z3 c9 f" T/ J        varargout{1}=sortstr;
    ' D- Q4 d, l$ S6 e$ Z6 p) Q' n, ]8 L1 {- a- ^elseif nargout==2
    % D8 e1 v4 m; ?. O% a/ z) h2 \        varargout{1}=sortstr;
    0 c( H$ K0 @: K) c, G) Y        varargout{2}=order;  v' ]+ s  z5 {0 e
    end0 W3 p' t: Q+ G& c, s8 ^/ K
    复制代码( I+ q2 a" p( ?+ w+ J) {8 K
    实例:
    5 d" g: x0 w# H1 O: A%对D盘下面的bmp图的文件名进行排序; e- r( o* R+ t3 d- ?
    clear
    . t9 B% T1 `+ K/ Hdirpath='d:\';                %路径4 O4 H8 G, ]' s" u
    extname='bmp';                %扩展名9 e) V! {3 _" L' z8 q* g
    3 V* j8 X9 t9 Z0 F" f
    if dirpath(end)~='\'                %如果路径后面没有加\,添加& B5 p2 W8 c2 F
            dirpath=[dirpath,'\'];
    ' c4 t; E1 |# G+ V8 r* |end$ `7 V1 }; y8 g) Z8 C
    ; k: h3 q0 R$ n7 @4 W$ J5 `# z
    %先取出目录下的文件信息
    + i0 S5 C) [, w  \2 H! T. K, Epic=dir([dirpath,'*.',extname]);
    . f7 W" E! ]1 L' i. a' kfilename=str2mat(pic.name); %取得文件名
    7 _% L, d7 O+ I. p5 j; M8 w
    8 ]( ?" M- K6 |4 W( s8 J: G% Z%调用函数1 n% u! H! d' J) A& R* M0 R* o* y
    sortfile=LengthSortStr(filename)* ?* v. X- \1 M" d8 m( \
    复制代码
    ) q4 h5 J- A4 O& P: x
    - J" D0 s5 ~" w3 q
    : k5 V3 Q0 e! F0 ^6 x" C- y9 n% \- r- L
    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-13 22:18 , Processed in 0.633077 second(s), 61 queries .

    回顶部