QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2866|回复: 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
    由来:+ P3 P: b& k) h1 D) N1 W
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是8 S8 O$ |  K, C0 N
    1.jpg
    $ x2 \, J0 p4 z9 o% ]4 _# ?9 K10.jpg
    $ O, X- ?) j& K2 q- \8 T5 D2 T100.jpg
    ; P* j; Q2 k: O9 ]( z: B101.jpg
    , m9 `0 @  d& R* }' j5 v9 ^就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    - D. K7 F" ?' x* c$ a
    ! _' t* ^! h# `2 R. P% o当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    4 T( J- L* ?* y( \1 ~2 N当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。* P5 O6 `, {  B$ \. P! R
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    0 {* k+ ^+ r9 o7 K) v6 k5 U. E5 n, o
    8 m: J2 W/ b# O9 {  V/ y
    : q: ~9 C! m8 A9 k6 s提示1:文件名的获取& G; I) g% R( a& B1 c& x8 {
    通过dir可以得到目录下的文件名,比如:
    5 u! u$ s" a: d" w- N" s& p" |jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    7 P5 ~# E' u# d4 ?  ]filename=str2mat(jpgfile.name);  
    - c" J# ?( \% P: b$ G% a# g8 {; @3 \5 m# F' {8 J
    提示2:字符串数组9 O3 O( x6 T# i8 W6 B
    先试一下:6 F% X! x  G) e, [/ R; D: z
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同5 V8 a4 I' f# d  B
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同  o% f5 _& U2 J: p7 @" r
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。: k7 A# n- p/ E
    0 a, b: \- A4 @5 |8 P% }7 d# ~9 \
    这样就导致上面得到的filename每行的长度都相同。) T, \& u5 _. V
    " T, g9 a4 K" D* Y- m
    % z4 J6 d* d) ~0 R/ x; `
    本文原理:
    0 g4 v7 s6 o* f; q+ u, s先判断每行最后面有多少个空格,
    ' x6 K3 n9 s! w$ |7 Q然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    - Y) L6 n; o# `4 y& `: \6 l这样排序就可以实现上述的文件名排序功能。; v) z7 i. W0 t9 z0 c) T

    + d# T+ }, [9 N3 m4 ?2 |5 [# i) @# F: J2 ?  ]
    本文代码:: g: y1 t  A7 W* g
    function varargout=LengthSortStr(str)1 L% C% z8 W, f$ w6 b1 L
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 G3 c5 x4 M% R) u# y, i( Y
    %Argment:                str文件名组成的字符串数组( ]  W" i# }  l- w7 O
    %        :                输出参数同sort函数
    ) Q$ ]6 A& Y( c& m; H  A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* u' u2 g* ~9 z8 n
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好( l/ o  M  f4 r! {& C! `  c# r
    / P1 |- L5 n0 r6 B4 v1 j) v
    [N,MAXLEN]=size(str);        %个数以及每行的长度) s1 K) {3 D1 V6 ^5 g! @2 a
    newname=[''];0 x% _0 D4 g5 r( H

    . d, G. F0 c' ~) Yfor i=1:N
    0 V3 A' l6 r& v; @' I* s8 M        BlackSpace=0;
    5 y7 U3 e+ ]9 I2 x+ U& @$ o        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    ! [: t' g( |/ y% U                BlackSpace=BlackSpace+1;
    & ]) x& i: y" ^7 ~/ M        end
    5 T# ~* w: O. P6 k                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格" ]/ u6 B& a3 T/ A7 n0 M/ Y9 N( @
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];% @5 B) |. l8 o' k
    end
    : X8 ?4 Z& N7 `. O[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    , m0 h' |" j- W% E( v9 [sortstr=str(order,;                                %由这个序号生成原始的排序名
    # _. v3 a9 Q; |+ I9 t; P8 k" s. G0 R
    if nargout<=1
    1 }, e( L/ H, c% M/ x2 ~        varargout{1}=sortstr;6 O, T: g  ^& m1 o
    elseif nargout==2
    ; ]1 P% ~  E, q        varargout{1}=sortstr;
    ) l" K/ ~5 T- h6 s  \1 B5 `8 y2 R$ Q7 c        varargout{2}=order;, {- T. u( R" L) M0 l7 \
    end9 |5 X$ ]7 t2 {" e! i. c+ Q) ]/ F
    复制代码+ K, D+ e3 X+ p  F
    实例:: l7 T" G. R+ s9 g4 x+ t
    %对D盘下面的bmp图的文件名进行排序
    7 C7 K# F& ~& e9 ], ~1 jclear# s9 X; X3 _. d! |+ S6 K
    dirpath='d:\';                %路径+ V/ M, E4 L8 u% ~: s9 n( S$ l
    extname='bmp';                %扩展名  j' m% n: z1 U1 _5 _
    , w- E2 n8 @, A% y2 }( x
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    8 t9 `8 ~/ L5 K( h        dirpath=[dirpath,'\'];5 f8 z/ F9 ]8 Y, S# K# z% O
    end
    ) y* T: b( W+ w. b  ~( ?
    7 \# x' k! ]. X$ ?%先取出目录下的文件信息
    / @$ a" F# Z1 Fpic=dir([dirpath,'*.',extname]);! T0 @  ]+ t. C9 S) X( @
    filename=str2mat(pic.name); %取得文件名/ e2 X7 q9 Y2 y  h
    ! f) {& l# e  d$ A0 ~8 X
    %调用函数
    $ u, ?2 o) Q5 S$ @- U0 p- R; Hsortfile=LengthSortStr(filename)* s9 ?7 }/ ]' x" ^" [9 X8 g
    复制代码' T; o' Y+ C0 G1 J- q+ y
    " Z% H- Q! E/ U  ?) D- U

    0 @3 a: q2 k: X& c1 a/ C' Z' Q$ r
    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, 2025-8-19 21:40 , Processed in 0.575250 second(s), 61 queries .

    回顶部