QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3208|回复: 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
    由来:/ W1 n4 `7 \2 a
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    ; g7 b4 b$ u$ j% ]* S1.jpg
    8 b6 w* G! [. M6 e10.jpg
    ( Q# d; n2 \% X) T: f100.jpg
    + T, I* A2 G1 y! |5 ^& P101.jpg$ X/ _" O1 ?! ^
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。3 \1 o4 R/ V" w8 K

    : B: b9 D! L0 C3 R( F* t当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    2 v+ Z0 F4 q' ?: S9 k当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。2 C# i* |* o9 F! G# ^6 I0 @$ G" f
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    8 X/ a/ |3 O/ n+ G/ G: z$ y6 r. O2 ~* L2 j3 G( H- {' g" _6 l
    5 _( e4 T( j4 v. |* n! j; Q
    提示1:文件名的获取
    6 L3 _7 c8 l0 g$ U" `. f5 K7 [( ^通过dir可以得到目录下的文件名,比如:$ I7 Z* a5 v( q( p
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。7 R5 P' G: @  S& v
    filename=str2mat(jpgfile.name);  
    . r/ }; t: Q  m; R- ~) a/ P  b) |- F% m% S/ |+ H" w
    提示2:字符串数组
    : a" K0 W+ S# k: H% M5 w先试一下:
    3 z7 S% t9 L. R7 U# d; Qstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    + Z- L2 `3 o: j* e( _: `7 ^str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    2 W7 z4 A. B- k! t6 o% U  Zstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    & d, W8 ?3 S1 \  N) V9 `, w
    8 W# k  O* ]6 F这样就导致上面得到的filename每行的长度都相同。
    ' ?' q/ C0 P! f2 V+ Q& C+ y
    3 t' i' A0 Z* ?
    0 I+ E. T) i2 O9 x$ X9 K4 u本文原理:% o# V7 L& u6 k# z* O6 n
    先判断每行最后面有多少个空格,
    # p% G6 L" Q- W1 b) X" p1 J然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串3 d1 S5 m: ?$ r) x" Y
    这样排序就可以实现上述的文件名排序功能。
    . M# ]8 x2 m+ p4 I  z8 h' N9 C
    * D4 l4 L9 s# O; l5 ^5 m  S3 B2 W6 z- ]. {
    本文代码:- f- A) S" u, E6 r8 B& j( r
    function varargout=LengthSortStr(str)/ H  k; o) x+ B/ }$ a
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    : l6 R1 b7 O* Q/ Q! ^3 I%Argment:                str文件名组成的字符串数组! w; k5 n) [) \. t
    %        :                输出参数同sort函数0 k# d! v9 V9 V5 \, w2 w
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ( N$ ?) B4 z0 u2 r$ ~ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    7 w% U" ?7 A7 \1 z: b0 w% U# P. l+ H  H8 ~. K& R3 U
    [N,MAXLEN]=size(str);        %个数以及每行的长度
    1 h* H3 H+ R3 A; F* }3 s4 p. S: N7 Inewname=[''];* I8 B1 G, H1 }# x  b4 E
    6 S) F5 d- x6 G1 \, P9 M
    for i=1:N" J+ d4 m, D0 @7 `- F& X/ Q4 J
            BlackSpace=0;
    7 ?* O' Z# ~- y' ~        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    % v0 x7 ~, E9 Z, V* x* `7 X                BlackSpace=BlackSpace+1;7 k# T" ]; f7 g
            end7 X3 g/ p& J9 @; Q8 p
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格" G8 Y+ Y$ ?" ?. \3 g; ?$ v
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    ' b" F9 a* u5 p. vend4 v  a  B: w( m- f9 t) W, v
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    9 Q( W' C' ?2 A7 E4 u) q6 Psortstr=str(order,;                                %由这个序号生成原始的排序名/ ]% \  \$ M9 ~9 S3 k  \. J

    3 S; m0 C! v' M  C; T/ N6 xif nargout<=10 t4 i$ @- s# W2 m
            varargout{1}=sortstr;4 r8 Y, I1 {) w/ t% M6 }
    elseif nargout==29 O0 P  c+ B: E( k4 m; D8 w- ^) [
            varargout{1}=sortstr;
    ( Z" p4 H( w. ~5 N        varargout{2}=order;! c0 z" L( e" P, q! e
    end( f+ ?" T6 [1 ^. M+ s/ V
    复制代码' P6 C$ N" R& C% F
    实例:
    5 V! I' \6 r0 T; F8 f1 W0 W%对D盘下面的bmp图的文件名进行排序$ p2 Z+ q% _, O% @- x
    clear# U$ j0 o9 Z9 Z/ k" a# w5 z
    dirpath='d:\';                %路径
    / A0 M9 [/ E( v) a# Bextname='bmp';                %扩展名
    & C' i: V+ e& t2 R% F( ]" S' a7 y7 P0 g0 _
    if dirpath(end)~='\'                %如果路径后面没有加\,添加7 P( @% j: G/ W+ N) y& ~1 l
            dirpath=[dirpath,'\'];
    2 {+ b: v" Z/ f* |2 Hend) n- Y% e: D; ]) Q, U- _

    4 x* B" ~3 d4 e%先取出目录下的文件信息
    4 l9 Y# R! j& ?/ S( Y; v; I; Gpic=dir([dirpath,'*.',extname]);
    ; z/ q0 j( K' h# M6 l& ~$ Q& efilename=str2mat(pic.name); %取得文件名
    % m, L) |1 q- O( q$ @" }) g/ A5 c, l$ m9 X8 W/ ]
    %调用函数5 ?9 O) t' u4 @6 V& B; F1 B
    sortfile=LengthSortStr(filename)
    2 a# B. Z) t& @' g* _复制代码
    3 q/ _7 F% X& [9 r% c2 ?
      O7 B: ?' O! S8 B- T$ @* m$ H- _2 i+ e% ~
    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-9-27 21:23 , Processed in 4.389202 second(s), 61 queries .

    回顶部