QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3207|回复: 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
    由来:
    0 l3 C4 u2 P- f+ q手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
      o2 Q* f' N$ r/ j! t/ e6 x1.jpg
    1 E( y2 k% C" j2 `5 N, d10.jpg
    . t. u+ Q6 ?% ?2 r9 i100.jpg0 ]  x/ Q5 c% o, o* J) @/ K1 O6 H! Y
    101.jpg
    0 d4 W8 q" \0 R1 t7 j就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    7 c  i; o' S9 E9 J+ y. @" z4 k& V1 x4 I: t! v' c" p) ~
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    ' |0 c0 p9 e1 j当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。- t% C; q7 Y* e  e9 q9 ]2 X
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    / v1 R4 @/ ~+ `  b5 ^: U1 U; q1 V
    7 V* t% b1 j( `4 t+ a( @$ U$ P) O3 h0 w0 Q
    提示1:文件名的获取* D3 o/ `/ N5 W+ u# ~
    通过dir可以得到目录下的文件名,比如:
    3 a: j6 ]" d; ]0 a. X( j3 o3 wjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。" M, ?4 J: [( |; V4 T  r6 N! k
    filename=str2mat(jpgfile.name);  
    ( v' u. \# ~. f* l/ t* ~
    7 J7 v* G( x. ?. P8 y0 f! l提示2:字符串数组; s: @2 y: w' r2 W" P4 V( L. K
    先试一下:% D5 {, V0 r, q4 L7 b6 |% ~' g
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    ' T# s0 a1 X( R3 l" }. Dstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    & Z5 p* r$ C" c% `3 \' Kstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。/ E$ l+ y+ @  X: G1 g  K: w! h- q
    0 w% {- X7 ^8 d; l7 S: Y, j
    这样就导致上面得到的filename每行的长度都相同。# h$ g% y, e3 y5 Y

    % A8 Y; F4 P" C* I& O
    6 U# I/ e8 y9 r& x, x本文原理:& v' P0 f5 ?) ?
    先判断每行最后面有多少个空格,6 @4 `4 ~; p) _) _# W% ~( Q' f
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串6 j. S+ G* b. m: G9 s! ?1 g, B
    这样排序就可以实现上述的文件名排序功能。, Q1 U+ t' ?3 w: E/ k8 Y' Y

    ) I0 T; g# U1 J* b1 q$ n8 w  m5 u+ I0 E. V& p7 e
    本文代码:
    + d2 @1 m/ y3 I8 Gfunction varargout=LengthSortStr(str)
    ! s9 O$ j( C1 z7 }%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ X. B2 G( h" g  B5 n
    %Argment:                str文件名组成的字符串数组8 k, d  F0 A+ M
    %        :                输出参数同sort函数1 Z8 ?& u8 t: Q
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. Y  E! q$ h  w$ Y: s9 ^- Z$ z
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    # m7 B4 }) G; V6 S9 b$ v4 g+ F
    : l3 @3 Q: O3 o7 p' E" J[N,MAXLEN]=size(str);        %个数以及每行的长度
    ) |- Q6 G+ D1 Q9 u' dnewname=[''];. Q: V; N  ^3 r

    ' L. j) p3 Q9 I8 Y% G8 ^5 d! Kfor i=1:N6 E( o- {% y$ P  K) g4 d
            BlackSpace=0;& K- Y* K. O3 k) N) R
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格: I$ P. c* a9 [0 U( f) E$ w  C; A
                    BlackSpace=BlackSpace+1;* N! B0 H0 {# |' o0 Y5 \
            end
    ) {1 m( r8 C& Z% @# E# J) J0 a' y                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    0 G3 t: D5 [( }1 ~  b        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    % f( M. ~3 G9 Uend
    : ~7 t5 `6 _' b6 f8 z! p[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号6 Q9 n* r3 B  `+ z% }9 u/ ^/ H
    sortstr=str(order,;                                %由这个序号生成原始的排序名
      ~5 Q+ r2 U, [' m+ w, v, `5 @: P4 c0 v& S- N1 R8 g
    if nargout<=1
      N6 ?3 h2 d6 i/ Q7 v; X        varargout{1}=sortstr;" U! ~5 C5 S. G/ q5 y
    elseif nargout==2
    3 E) e& H1 u  P. K9 w' W  `        varargout{1}=sortstr;) \& j# Q6 \: [* O5 p
            varargout{2}=order;
    / F% }0 o* C3 [  S! F7 Cend1 M  l/ S" q6 ]" c' M3 k+ N
    复制代码& b- b1 |0 Z, e5 T, S% v3 ?
    实例:& X5 b' \4 ]: y& B" B; N
    %对D盘下面的bmp图的文件名进行排序; U% h( c3 A& g6 U. O( B5 v* L
    clear
    4 C: {) G4 e! A/ V9 t7 o) Zdirpath='d:\';                %路径- g  _6 ]4 V# o7 b8 |/ Y
    extname='bmp';                %扩展名
    ; L% g7 |/ F$ M; u( L! o6 {- K9 Q- H- o3 C
    if dirpath(end)~='\'                %如果路径后面没有加\,添加& S- }; Z& f, K9 f7 x# G8 E6 H
            dirpath=[dirpath,'\'];
    ! J% K- s) z$ s# b. l8 U0 m* }2 iend/ K0 M7 Y7 x; A* M6 m- _

    4 r+ F, v& f0 k0 v3 S! w7 ?%先取出目录下的文件信息% u8 Q4 I0 R% A0 i/ G
    pic=dir([dirpath,'*.',extname]);
    % O2 Z0 N- L2 p0 ]! B/ V+ Dfilename=str2mat(pic.name); %取得文件名
    1 U6 W: V' f+ P+ y2 j4 K4 g- ]* d6 B- k1 J) g
    %调用函数
    + ?& S3 z; Q+ i/ f/ x6 h, _" j7 _sortfile=LengthSortStr(filename)
    2 x( G, y  S3 \5 n* ]# n- c+ M复制代码
    3 g: y$ C6 J1 i1 S4 h& `( P
    / L" o9 F* n, i+ c( a; ]5 t( Q) L( }" V  ?: J
    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-9-27 21:11 , Processed in 0.409268 second(s), 63 queries .

    回顶部