QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3158|回复: 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
    由来:/ C* M2 t# g9 o( _$ r
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    * Z" s) P0 F+ v, W# W2 E' p1.jpg
    : \. ?- x/ M" h: M/ x+ }10.jpg8 S' W5 j3 f5 r" @: |+ C1 ~1 ^- c
    100.jpg8 J* e7 f; e# q( L. R' M- A
    101.jpg
    $ W- W+ E6 N! W0 O! E- |5 J0 I就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。' k/ T9 ~1 w' R; \

    : m; [6 J/ G  U  H8 q% b当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    0 X; L  p. s2 v4 I9 q" z: D当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。, i4 U7 [5 \& F! v/ t- O$ Q8 a0 h' `
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    . I/ [; i1 R# w* ?: \' T& D6 q2 R  ]" x2 {
    ! k% L3 r8 E8 b# E0 [* ^9 d; l
    提示1:文件名的获取; B* Y8 y8 q; K1 ]* O) B- u" S
    通过dir可以得到目录下的文件名,比如:2 N. l, A, c6 s  ]  _( q. X* A5 K
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    ( ~/ y2 w, {& f/ c# G9 G8 B+ c4 ffilename=str2mat(jpgfile.name);  ' h) w* |) Q" f- T( r3 i4 Z

    7 d* t) n% W) ~' d0 ]# J( X+ d提示2:字符串数组" i/ a4 w' u6 M* z, P, d
    先试一下:( p6 G( }" F9 h' O! ^
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同$ }' [7 ?  X; L( @9 E- F
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    7 M. e8 b. I/ p  vstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    / P9 W+ e/ W/ H% f1 c- ]" |% S3 j2 s% C6 e4 d# c- t7 G8 w
    这样就导致上面得到的filename每行的长度都相同。
    . T0 Y2 @0 @3 J/ a  H3 h9 B, e$ o; Y+ i: b
    - @" d9 L( }, f
    本文原理:
    5 o+ [, T+ U9 D& \先判断每行最后面有多少个空格,# H! c  V- Y5 x8 Y
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    , d! n0 D" `/ W8 _) w6 R; Z+ p) u这样排序就可以实现上述的文件名排序功能。
    ! M# f# n% T" h& E
    , p( ^! H; k% T6 P$ E( x
    7 Y* x4 S: g) c! y5 q5 W本文代码:) |; O& D- k$ q" ?: m5 a# C
    function varargout=LengthSortStr(str)
    1 o; V9 u, S5 H1 M% B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    " K- _0 w$ ]7 ]%Argment:                str文件名组成的字符串数组' ]! B4 X1 S( N) W3 g5 m6 S
    %        :                输出参数同sort函数' ~5 M  O/ W: E! q
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ! E" ^6 t2 D2 V4 c% O" s: o. ?ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好% @# J7 }+ P% i9 e1 G7 S1 s

    9 q, s) ]6 t; o& E. I" ~! d[N,MAXLEN]=size(str);        %个数以及每行的长度0 H8 V" y6 P" u, \) ?
    newname=[''];' `0 [/ |4 f0 \6 k% D" u1 j

    0 a! M* U; H8 h' G/ M+ Y" F; ^4 @for i=1:N3 t- z( O) Q8 B% P5 d- }
            BlackSpace=0;3 F! `. c) Q% J1 {. E* k* a" N
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    ; U; h6 B# Y. y. P4 J5 Y                BlackSpace=BlackSpace+1;
    ( M% L& x) h, g/ E4 S+ L        end
    # ]/ P& k' i% ?8 N0 p                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格* K% H$ m  u6 n% S3 p
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    " a% I9 ?& ~4 G4 J, Aend
    9 j% F, E3 u& D' h8 K& A[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    - t' t+ S9 G& ^6 B% wsortstr=str(order,;                                %由这个序号生成原始的排序名8 l$ A! G& m& T6 F. N
    / ]0 C& C" D, E8 Q
    if nargout<=16 w8 K4 C+ k. f. p/ B9 I: V
            varargout{1}=sortstr;3 g6 n' w$ X$ g6 E( A6 B3 g
    elseif nargout==2
    * O" ~* Q& b+ E- u        varargout{1}=sortstr;2 A+ n. Q. B% Y
            varargout{2}=order;
    ) E% j; b. [, C3 k; kend$ u; N+ q/ c0 j
    复制代码6 w1 U* x, }6 @% w/ V
    实例:; z- z! ~; @9 s/ q6 ?  e. x$ a
    %对D盘下面的bmp图的文件名进行排序% a+ @2 ~+ M; N4 R# y
    clear& q% G- g' M# F
    dirpath='d:\';                %路径4 }$ y' b' `5 S2 {7 l2 K
    extname='bmp';                %扩展名. G1 g7 i+ c- _& U8 f8 Q: V2 z8 W  F
    " s6 _$ m. C# C0 x* g+ f
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    + t% k; E) C6 \% [. P1 o        dirpath=[dirpath,'\'];
    / B" K3 s4 z3 b- Z% bend' ^7 n# A, A, A; ]
    * n% Y, Q" H: R6 Q# S* C
    %先取出目录下的文件信息
    / C* r3 z9 g# epic=dir([dirpath,'*.',extname]);" N. `6 f9 C! w3 w% \
    filename=str2mat(pic.name); %取得文件名
    & K# ]$ S8 ?6 ]# z2 a! |8 T( I6 `; a0 m6 o% g9 z
    %调用函数
    0 c$ _8 T$ p( U/ dsortfile=LengthSortStr(filename)
    4 c/ v0 g; Z, |- c0 p6 L" G复制代码
    ' Q  l0 }0 a7 G9 p( h: G+ Y
    7 [9 W& y' b3 v1 a0 l; s6 Q$ t  L- S6 O" z9 S. |- T+ N
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    12

    听众

    43

    积分

    升级  40%

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

    [LV.4]偶尔看看III

    回复

    使用道具 举报

    冻鱼        

    3

    主题

    12

    听众

    147

    积分

    升级  23.5%

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

    [LV.4]偶尔看看III

    邮箱绑定达人 社区QQ达人

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

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

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-30 20:03 , Processed in 0.435842 second(s), 62 queries .

    回顶部