QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3134|回复: 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
    由来:
      w/ p: l8 C2 B) R; T# e$ t3 L) i手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是$ l' k! x) V; _- I, n& ?7 ~
    1.jpg
      O( \5 s! Y" n( `9 B1 m+ s10.jpg- j- e& d) ^$ p0 f& S( ^' O
    100.jpg2 f$ l4 `9 i* S7 G! C% V
    101.jpg
    8 N3 ]* T% V9 c' q% R" t) S就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。; j0 s+ Z# B/ t: K; [2 g6 _1 s) _- x
    , b$ O# i8 @9 m. W6 p. v
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    - Q2 a( U1 `( a9 p( u# q3 _  q当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。7 g0 N  I* a0 o8 M/ r5 a. W
    如果不是上面两种情况的话,本文就是实现从小到大排序。+ d+ q1 h  j8 _5 t

    $ Q" m& d9 Y" v( C" f1 d6 q8 x8 w( s6 Y% A! W
    提示1:文件名的获取
    + i( |5 t$ ]# _通过dir可以得到目录下的文件名,比如:& c" q1 P5 q2 L# x) U
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    6 r9 P  C7 }7 E$ P8 R2 o4 _filename=str2mat(jpgfile.name);  5 x  ^* N1 E+ Y$ e5 a+ t

    : C3 t0 G: w# }+ q# }# p4 [! V提示2:字符串数组
    7 w. r6 A2 D' L  `; w4 B( ^" W) G* E先试一下:2 j9 m: P; |% Q
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同* {3 f3 e$ ?% R% O# d3 i6 |* K$ v' L
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    ! ^( x' q' w1 ustr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。2 V' y  M" x; ]% X# N, x
    8 I7 d5 h1 C% T7 Z8 F! @
    这样就导致上面得到的filename每行的长度都相同。* k9 b4 p* f9 g- k

    8 K/ p2 y* W9 s5 T9 v4 L$ S0 C
    ) |, n5 I: t. h% l; b, F- c8 s0 U本文原理:
    2 D0 v& E! i# [& z) ]先判断每行最后面有多少个空格,' {: l+ x! Q& j+ T% Z- W6 u0 w/ j
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串1 a8 x' R. z9 N3 z& C% D# g- r
    这样排序就可以实现上述的文件名排序功能。2 M) G; d( \" {$ A
    ) _; ?2 {6 R1 c6 ~8 J+ |- c
    6 D2 `+ n0 }5 N* o  T
    本文代码:
    ) y, A; e! j1 m3 t$ U& K) ufunction varargout=LengthSortStr(str)4 t$ s! W* S9 r0 x/ U1 D3 n: h
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    3 T, b4 B$ F+ R4 k( n0 @; a%Argment:                str文件名组成的字符串数组* |" H" _/ S% ?# f& q0 n. {
    %        :                输出参数同sort函数8 v2 a/ ^3 |1 v' s# H3 x
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ' K5 X5 h2 ~2 t) w& j* rch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好! |6 Q* ~- B% S3 T6 Q' C- T

    5 a3 N, \' K7 w5 u' y9 ~  h[N,MAXLEN]=size(str);        %个数以及每行的长度
      F4 d  @% e, W3 L$ r1 pnewname=[''];
    8 z+ y$ A) M5 k  R5 E* ]7 w5 n! A5 M" D2 B$ v9 f
    for i=1:N
    0 ^# _8 E9 v' `. f$ h" b        BlackSpace=0;! _* S! y# a8 ^2 \2 j
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格  s% A9 d4 f. b/ q4 r
                    BlackSpace=BlackSpace+1;
    $ k. o" T9 j/ k5 O  o8 r        end' B0 {' y9 I! j3 i0 r5 {% Z& q. O
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    5 m9 s* c" u& y$ d3 s& ?5 G( L' I" [5 [        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    $ ~, s. v% l1 k4 u* C" Hend/ y& M) F8 \: W
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    + Y9 P! L4 ]- Q. ysortstr=str(order,;                                %由这个序号生成原始的排序名: A2 K1 \  T7 `

    2 [% U" k' ^  |2 v9 T1 {if nargout<=1
    0 Y. Q" n' @- M/ e5 \1 m        varargout{1}=sortstr;) D# X. E. G+ @, B
    elseif nargout==2
    3 ]  g+ }- L* g: [  K( }- I        varargout{1}=sortstr;) \- X* m& Y: h/ N. d$ W' @* s; U
            varargout{2}=order;
    " f) n1 ^  k4 C" W# [8 Rend
    ! O( \) J% w9 d复制代码
    $ T/ r5 l& T* Z9 h* s  R实例:6 N; l* f( c& A, F
    %对D盘下面的bmp图的文件名进行排序  C5 v( a+ o+ f% P' S
    clear! t" c7 V- @" h8 X6 P4 L
    dirpath='d:\';                %路径' `8 ]/ G2 I0 @' `% _6 W) D. w
    extname='bmp';                %扩展名
    7 z: C8 u& O( J$ h9 h) y0 }+ n8 a: O; o' B% i
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    $ a- R" b$ I/ X; q* g! F        dirpath=[dirpath,'\'];
    ( ^$ x  D3 G- }end
    : {. C6 R+ _" f9 I# E6 N3 R( J( f4 q/ ~5 X/ o& {9 H
    %先取出目录下的文件信息5 S1 _. x9 W& m3 A8 B9 x
    pic=dir([dirpath,'*.',extname]);) J8 b% x' d1 ~
    filename=str2mat(pic.name); %取得文件名
    % _" h5 u, q* M: T! y* k
    ! k1 h8 c- O/ T5 A% r5 C%调用函数
    # `/ t9 B5 W3 y+ k- gsortfile=LengthSortStr(filename)+ L6 o( v6 C% x9 l
    复制代码
    # q7 y/ X+ Q; v1 M. J
    * Q8 O2 W; ]  _5 x' c+ N, Y- I5 i/ e5 O. Z% R0 E7 d; K
    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 19:30 , Processed in 0.389376 second(s), 62 queries .

    回顶部