QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3136|回复: 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
    由来:
    6 f4 @! G4 c2 w2 _0 h手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    3 L6 a9 g) \9 L% G' F1.jpg
    " ?. q& b3 O/ M! j7 V8 j( e10.jpg% s4 W$ T+ m: G6 B' j
    100.jpg
    % E. K+ X+ T9 i101.jpg9 m/ _3 M  q' H2 h. t
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    7 Y9 X& W4 K: H- t. N2 O) V+ E
    # b7 f+ b, {8 O! w; c6 l9 N  e当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。% D( U- q& n3 j0 }2 @
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# l  `- b$ L+ _! z  N: H
    如果不是上面两种情况的话,本文就是实现从小到大排序。8 S3 a3 i9 z! `
    ( }  a; ?8 i. \4 ?& ?# W

    ) y8 M8 _4 ^2 a+ \) [提示1:文件名的获取4 \, B1 x7 j# X
    通过dir可以得到目录下的文件名,比如:
    + v7 }8 l; G( T+ X' Mjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。8 ^- _2 _/ P" N: R, }" W- C
    filename=str2mat(jpgfile.name);  
    $ i4 n, Q  Z# o# U$ D: f8 u3 A# K; i) \7 l, `
    提示2:字符串数组
    7 n6 R& D. A  k5 j, V6 U! C先试一下:
      y) r" W5 q/ W# P3 y8 Dstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同* e: l9 N/ o$ @  [$ ?
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同# O0 E5 d+ w* I
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    ( r$ c$ x* x/ P) y, `, f
    - x5 H, n" [, ^0 K! u" X这样就导致上面得到的filename每行的长度都相同。. ^6 P/ e, k# Y1 T
    ' E; I( O7 ~. w3 d& h$ A
    / R0 }+ Z$ M/ S$ p0 l
    本文原理:
    # a' E3 }0 N4 c- S1 _/ M9 P$ V9 `1 {先判断每行最后面有多少个空格,
    - s8 o! t  [8 O/ O/ f) u然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串% }8 q: t' H! }
    这样排序就可以实现上述的文件名排序功能。$ H% l7 f$ N0 s; u3 t# R- n7 y% \. S
    ( F7 l% F" L' a. _9 U1 Q2 ?

    . x- t9 J0 V- E+ |# ~" O" R! b3 x本文代码:. G$ h% S! C& i4 B( r
    function varargout=LengthSortStr(str)3 @, B2 E# @2 R; \7 \
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    : b+ E1 U) l' {/ c%Argment:                str文件名组成的字符串数组
    " z0 m$ ]7 T  ~! V) l, m%        :                输出参数同sort函数& x* E& b2 u- \2 w4 O/ G! `; B" y
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ g) l0 X  C6 f. |! @6 f
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好, B$ e) T$ C6 x" O0 e( ^7 R
    9 W# |4 c3 k. z. |  h+ Q0 ^
    [N,MAXLEN]=size(str);        %个数以及每行的长度6 D% a) X! c) Y: B5 g! `
    newname=[''];! b: E1 N& G5 M& F- I' U/ W
    , N( L% a: n  n+ r( {6 \0 L0 B
    for i=1:N
    , ]" u4 q2 V" x9 Q8 ?8 ]  o        BlackSpace=0;
    ' e  s5 k) r7 P0 p6 ?2 v        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    2 Z4 ~& }+ n: X  ^                BlackSpace=BlackSpace+1;( B6 f! ~2 M* o1 c" c% y% c' J
            end
    1 p! S8 [, f+ \                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格# b, K- |& w$ e1 C0 `
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];7 f9 Z, I9 e. m! v, S& p. J/ W( @, i
    end
    " W) w+ _7 ~. Y0 n) p[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    3 N( U$ P0 R( I! Q  z2 e, Nsortstr=str(order,;                                %由这个序号生成原始的排序名/ y4 _7 L$ a+ p- j

    7 G: G9 X. A- r/ h0 L5 W& lif nargout<=1
    8 l# G* n% _/ x" K; o        varargout{1}=sortstr;
    - U, r7 L2 c+ Z. selseif nargout==2& Q% ^- y5 Q8 u
            varargout{1}=sortstr;. i0 x+ r" V: ], T" E3 |& ^5 j
            varargout{2}=order;
    ; e4 \3 L" ?: C7 w! a' a8 z" k$ w) Gend
    ' P$ {( ^" W9 `( X' ]) ]0 L. b复制代码
    . {9 D- g# k3 H- S# r) }: X* |' d实例:. g9 H  P7 m& m. ?9 z
    %对D盘下面的bmp图的文件名进行排序: V5 T% r/ H6 q# M" \; V
    clear
    ! Q8 u5 e5 {  c0 @$ ^$ C6 xdirpath='d:\';                %路径
    # u) ]  m3 G- J1 ]; xextname='bmp';                %扩展名
      x* I4 v! D$ J. [. |) Q  A- }( ?3 C+ a* `# S+ q. a
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    0 W$ Q# k) O& [0 O8 c. i        dirpath=[dirpath,'\'];
    - V( C" T$ u& }8 W" s. vend& J2 u  \+ j8 {6 B
      y5 i+ x# W. S! X4 _5 [% g# z! f
    %先取出目录下的文件信息
    9 I* b. u  x  N4 Rpic=dir([dirpath,'*.',extname]);
    2 ?$ g- I( V, [4 B9 C9 ~5 @filename=str2mat(pic.name); %取得文件名
    : D& e  T; Q6 ]
    7 }+ d( B. `4 g# t" o( {%调用函数0 c  X, _2 R; Y. {9 u
    sortfile=LengthSortStr(filename)/ u- z* B) X" f
    复制代码
    . M9 h- l. f0 O! U9 D5 h7 J9 Q# [& P; u

    1 Z8 d2 ^! w" ~( ~; T3 s
    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-12 22:24 , Processed in 0.412235 second(s), 62 queries .

    回顶部