QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3080|回复: 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
    由来:
    2 ]; j1 z6 g: @( L1 @; Y手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是7 T+ H$ `- l2 j
    1.jpg
    " {) d7 h4 `' {4 P% N10.jpg4 D4 T7 e% I; e/ r" _% E2 g
    100.jpg7 u. Q8 U& u8 n4 G1 F
    101.jpg
    4 E! g( f! k/ _3 @, s5 K9 i; J就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。2 O* E, w3 Y, }. N+ A; v1 O" l+ T
    # w0 ?( i; S1 G0 v
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    ! O" P) e0 `7 k+ O! E* ?  ~9 p+ N3 q当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。" n: Q, T; W" o% I
    如果不是上面两种情况的话,本文就是实现从小到大排序。
      z1 Y) p& E. W- j+ A
      `0 w3 ?% G/ b" h' t) u  E- L6 ^# h. z
    提示1:文件名的获取% t  j3 M" L1 n& F% S' ?& p, R
    通过dir可以得到目录下的文件名,比如:# e' E; f  O, j+ y1 A7 s0 C
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    5 L2 ]( _# q+ y+ Afilename=str2mat(jpgfile.name);  
    5 _6 ?7 {, t& N0 @
    3 M7 H. ^* o5 ?) u2 ]* t0 Y提示2:字符串数组
    . ?+ ^" `9 s7 ~- U% q) A% [先试一下:
      E7 [6 W$ Q4 m2 j1 ]str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同  w4 T1 L  y! K
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    ; U0 W; A1 `. m1 Tstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    + A7 d& I# O. @/ Q  M& Z' m
    " u6 W7 y6 ~( K$ n0 r7 L这样就导致上面得到的filename每行的长度都相同。
    7 D0 E9 `3 c0 `7 @, A2 V; i9 W# _# k

    ; r7 @( u8 M6 m1 h: z3 J. M本文原理:2 [, Q7 m' y* i% b6 M7 U+ w
    先判断每行最后面有多少个空格,
    ) f* E; M  {5 s1 {( k. Q然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串2 }8 S# `0 b$ P' x+ g; |6 F! R
    这样排序就可以实现上述的文件名排序功能。
    # {0 s& N9 e- |8 F* g* m; F: A4 |0 p, i4 a8 o2 h: X, f
    8 L: h; }0 t' F  Y, N
    本文代码:
    : ?: ]5 m8 {4 sfunction varargout=LengthSortStr(str)
    + Y0 p5 m  ^8 s+ S, u- P6 P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  `. C& w) r  r! ?5 Q5 s. r! O
    %Argment:                str文件名组成的字符串数组" s$ x; i$ w% `/ ~7 T3 E+ {
    %        :                输出参数同sort函数
    0 U+ e6 Z' \4 [, S1 ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 b- z. ]2 p* A5 f& r
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好0 }  G: D' j1 ?3 f  g+ z2 S
    7 W; T1 F# }! W' j/ R, H
    [N,MAXLEN]=size(str);        %个数以及每行的长度3 a0 J4 }0 b1 _6 L- h' `+ ^
    newname=[''];
    * z6 f; M! p9 Y) _; u
    % t# W# e$ t* bfor i=1:N
    , a: c/ _2 t( e" c0 c6 @        BlackSpace=0;4 w' h4 K2 \4 }& b, p$ o
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    5 K" j5 V$ E+ f$ ]                BlackSpace=BlackSpace+1;. Q. y8 N6 v" n1 k$ r- A
            end
    . I6 ^+ B0 g" |% B3 v: d) y, L. W, ?                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    1 g% Y5 l5 `: H6 X% ~, E) \/ Y        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];1 V+ B2 l  T$ D
    end
    # h! q) W0 F, A5 j[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号& s! t' ]2 h$ Q) v
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    ' ^1 i3 d  l; i
    * O3 B$ H$ X* n& o' A( dif nargout<=14 C" r& c" d+ J& b) v* r9 M
            varargout{1}=sortstr;
    ; ?' `$ G( S8 N0 L5 \7 Uelseif nargout==2
    2 g0 Y5 A5 k2 ?0 e; [' a        varargout{1}=sortstr;
    ! X. V1 i( ?! ~# e% N. Q' a        varargout{2}=order;
    1 t0 A* ]/ z7 C: c, f% L6 ^: k; qend6 ]' D. K( g( J8 H+ H9 m1 g
    复制代码/ a1 u9 q( ?4 ^/ x  i
    实例:4 U8 U3 s# v7 _6 I7 o6 I7 |
    %对D盘下面的bmp图的文件名进行排序- ]+ _7 N) L$ o( I( h3 J1 j
    clear/ O4 L2 J/ y* p* _: e+ V0 S
    dirpath='d:\';                %路径
    " a$ v4 e. U" g. l  p  L, X0 Vextname='bmp';                %扩展名  L9 t& Y/ [: b+ m$ N
    / I* j7 M, T2 Z7 |6 u! e
    if dirpath(end)~='\'                %如果路径后面没有加\,添加7 g* L" X0 }' C: u
            dirpath=[dirpath,'\'];
      l6 Y2 f1 Z/ n3 Aend6 I- r6 n7 H$ a  p8 G- b% a

    $ Q3 l7 K% K/ O, y0 Y6 V& X9 i%先取出目录下的文件信息8 C- _. b& s  P  K) x% H" I, e
    pic=dir([dirpath,'*.',extname]);
    4 c5 Z3 Y$ m2 e6 r0 {filename=str2mat(pic.name); %取得文件名
    + s# n  S. K/ V' w; A8 D% v4 L' n, N, G- r& |' y
    %调用函数
    , S( ?6 a; b) h7 q1 ^7 Xsortfile=LengthSortStr(filename)) _# q, T/ f1 F' ?  I, S
    复制代码/ b2 ~1 H' Y% k' d" b6 x

    " D$ l. z/ l7 F
    ) C$ T9 ?* j: k3 E- J: O
    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-4-13 10:00 , Processed in 0.341140 second(s), 62 queries .

    回顶部