QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3090|回复: 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
    由来:) J# x# ~% L  P0 |. L  X; Y, E
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    7 ]; ?9 R. a# I: V1.jpg% v( N4 K3 E8 S
    10.jpg
    ! |5 m' m! H4 \' i100.jpg" v' o  T$ B+ h' D/ Y
    101.jpg
    ' d/ v6 [: v9 X" t: |% a3 N7 B就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    8 X& v9 M" P* I) I/ }1 I
    $ y) c4 ]9 P: x  W当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    - v& Z2 V4 G8 ]( y当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。) ~5 A7 Q# l9 z- H* D4 z3 v# W
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    * g6 O+ g9 N- n, X4 J
    1 K8 |' E' J2 T4 P- B* h& `
    7 B5 n! R8 s; t  \  ]8 L提示1:文件名的获取- T  U: I  A5 F! V& s3 w7 Y$ ^
    通过dir可以得到目录下的文件名,比如:
    2 G  y, ^( V: }- ^jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。' C: X" C$ i) ]! a8 |
    filename=str2mat(jpgfile.name);  - o; L7 j/ }+ V' E
    / b1 a$ Y2 [. |
    提示2:字符串数组5 ]3 J6 O: }& d7 |  k4 W
    先试一下:
    - ]  N& K: a  f( j  G2 r+ D. {' w* n1 wstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同' `4 I7 H6 ?, U  I3 Y
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同  r! r1 ?# p7 a. A" U4 e
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    ! N! e: `. V% O5 n6 s6 V$ }# L; b& s- h! b
    这样就导致上面得到的filename每行的长度都相同。5 G; B8 c/ U" U: J& x2 x
    ( l0 Z4 ?& ^& N

    6 B! y8 Y" }' ?2 d本文原理:+ b2 j8 p: l5 q- G, [% x/ a) a
    先判断每行最后面有多少个空格,
    " p4 j5 K, g# n' c# ?8 T" n然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串- R2 r8 U( O# _& s* [3 W
    这样排序就可以实现上述的文件名排序功能。
    , O3 m" t- F( U. n& T, n* t, e$ \9 h" x3 r

    . o1 g4 Q$ n7 N5 n3 B2 S, Q本文代码:
    ! p# Q/ Z  E" |3 N# O$ Dfunction varargout=LengthSortStr(str)9 I( M# V( ~4 y6 ^
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  |; c, s! I$ F3 d, T
    %Argment:                str文件名组成的字符串数组
    ! {4 h8 r* _5 Z  v%        :                输出参数同sort函数
    $ l" g1 W8 |- g8 ]' o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % j5 d7 |6 x) a3 ech_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好& o3 v3 K1 O9 J# p
    " m6 |& a! y) T& J) w: d- S% O4 g
    [N,MAXLEN]=size(str);        %个数以及每行的长度( _" T' j# \: |: ~7 _; l
    newname=[''];6 P3 t& B- H' J* S, z: H! C1 }

      @/ F2 Q4 j. C# q$ M6 U  Hfor i=1:N
    * Z9 _/ q4 t3 {7 M/ i        BlackSpace=0;7 }$ _6 R/ t) g3 x: z
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    " _/ K) ]* M! t% X# |  |/ {                BlackSpace=BlackSpace+1;6 D+ X2 d4 \' j1 R9 R) ^
            end
    , x) b+ C+ s1 k5 E3 i( S                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    : B, o# T5 h3 l$ A/ d! R        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    7 I. n. N* g: [" R7 P8 I2 ?end
    8 |4 @" M+ z- \" J7 J2 G[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    " x; M( _5 e' ysortstr=str(order,;                                %由这个序号生成原始的排序名3 a6 R9 k" y4 `* K! \4 m7 [; L

    0 X# I7 E# S+ M  {) [9 ?/ S; y9 {if nargout<=1
    : f) {! c! A8 a6 T; L8 f        varargout{1}=sortstr;* U; p) C5 R! S2 r/ M! S" ^
    elseif nargout==2
    % x# M. X1 B8 L- |: O        varargout{1}=sortstr;% [2 t: P7 e( s; g9 O
            varargout{2}=order;
    6 L0 f& S! ]4 g4 r6 D. M8 B7 Vend
    1 l, t" t) T9 w7 m7 S复制代码
    4 K7 N. s/ O/ m% ?' n) I# d1 b实例:' i* j( T  `& F' s5 g- U0 Z
    %对D盘下面的bmp图的文件名进行排序6 a+ G0 w' N0 B; J, ^+ P+ @
    clear
      F) d% k4 I: w; \( v8 t( ldirpath='d:\';                %路径
    ! f5 i9 V$ P$ H, mextname='bmp';                %扩展名
    2 T( w1 z/ V+ \2 v
    9 d, N& Q% _  Mif dirpath(end)~='\'                %如果路径后面没有加\,添加2 C  I8 p6 {( A9 i4 K) W
            dirpath=[dirpath,'\'];" A% \( G8 u3 y. Q1 o
    end- G9 i5 c0 S" v3 S' C8 w

    " a( I: ]. m* f* u1 ], \+ ^%先取出目录下的文件信息! V$ l8 t( O1 R+ f% N
    pic=dir([dirpath,'*.',extname]);$ d5 N/ X% K) b
    filename=str2mat(pic.name); %取得文件名+ b) }0 l0 Y! v

    * x0 S/ B$ P1 T%调用函数$ \5 i( ?% ?! l$ g% c1 {
    sortfile=LengthSortStr(filename)& a% M& b, S& @: \1 x+ L
    复制代码
    . M# y6 C- t% ^6 b5 [  o" I) C9 m
    # D8 `) J" o' ^& y& d- P! A5 \  [. N- h  W
    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-21 13:50 , Processed in 0.542744 second(s), 62 queries .

    回顶部