QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3085|回复: 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
    由来:
    . u, _. P$ i0 H& e; r( \手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是5 L7 A3 Q! |* {& W) h; n/ |
    1.jpg& C7 n9 s8 C  Z- }3 o+ a" r  k; @
    10.jpg( t- R* X0 k8 |* Z2 A
    100.jpg
    , K9 q9 T- V+ J* q' W101.jpg5 b+ j# ]  z8 ~5 c
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    . K9 x9 e' F- _8 Z5 z
    8 J- f. {+ P) Q& H, s; B$ ~" Y当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。' R7 Q4 }  C" r" @
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。1 W( z: Q3 h# @, i2 @1 U8 p
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    " W6 f1 I$ R- \, y4 z
    ' A& a- y* F6 ]0 E- g; k4 y$ W8 e0 u% J! w, V
    提示1:文件名的获取& z* W; P: u" d5 B( ~1 a" f3 ^
    通过dir可以得到目录下的文件名,比如:
    4 s8 [1 g2 R3 G$ |: `jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    * y; f2 H, u% M0 ^; Z* b; q1 J; @7 Yfilename=str2mat(jpgfile.name);  
    6 N4 [( d% M- T' Z+ s/ W# E* ]5 k) r; F, y% T% s# e+ i7 G8 @
    提示2:字符串数组# U! Y! i; P4 j$ z$ @
    先试一下:
    2 Z% u+ @# G: Sstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同" c5 g# y$ K: d+ q; ~
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    1 B6 W! u) X( wstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。2 l% q$ O% Y, h& l  v0 ^; U. T
    , T; t4 ~3 w3 ~, q/ m! H
    这样就导致上面得到的filename每行的长度都相同。: n$ A$ Q7 ?7 p' ~5 }# k6 I& J

    + U- Z1 s, M, Z7 z6 Z" j
    : V9 N% y. g6 [本文原理:, Z- W5 D1 T! V) Z+ F3 ^8 ]
    先判断每行最后面有多少个空格,6 Y, L/ F8 Q1 t* G
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    8 h0 c9 J2 F& W这样排序就可以实现上述的文件名排序功能。1 F8 Y7 E9 H1 P2 z

    4 O% N) @" e! z/ ?1 h
    0 q8 y2 g. o. |- R2 O2 ^本文代码:
    6 a+ u. F! J* T; F2 G* R- ~: ~4 pfunction varargout=LengthSortStr(str): ]3 O7 e. ~$ H  a! e
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    5 [: q# C6 A& ~% ?* H: ^%Argment:                str文件名组成的字符串数组2 x: N  c' C4 o3 S) e# Q
    %        :                输出参数同sort函数$ {# u$ D6 \0 a( L1 _
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ) [/ I' C  o9 `' Z, e7 Jch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好' q/ x5 g7 N0 l! x
    3 `6 y& p' w/ \# o  z  j
    [N,MAXLEN]=size(str);        %个数以及每行的长度
    7 \& j+ ?* I1 f8 |) i, Anewname=[''];
    " s& p7 k. t4 X, M2 d7 m! g1 I) K6 ]' M6 y% R, J
    for i=1:N
    1 W) f9 Z2 T3 E- b7 b. i/ S; Z        BlackSpace=0;/ k1 j0 v# r! T
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格) y2 {+ T- J% [0 e2 C* Z8 o3 \
                    BlackSpace=BlackSpace+1;5 ~8 j$ r: ]& ~1 X% d( V
            end9 r# K/ ?  o$ w; i8 O
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格1 \, N6 ~5 n. h
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    " C" x; K- M5 \& N0 Aend% N7 z; B9 J  T: t% x1 M6 \, X
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号1 k! k- q+ y* Q, P1 W1 h6 ]+ L
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    - c+ |* M$ J$ L" j; v5 ~  u$ H4 `& f# M! d( U
    if nargout<=1
    % W9 G: \8 F$ O* I( M7 h        varargout{1}=sortstr;4 Q! v4 G2 H3 y. p: C/ {  g
    elseif nargout==2
    # \" }6 ?0 R+ m8 N* y; ]9 R* @        varargout{1}=sortstr;
    ! G8 _) O! m: H3 }- N  r5 J        varargout{2}=order;
    * U: O  j# ^; |6 E, D7 Dend
    ) A- n, }6 a$ A# ?% I复制代码- D, H2 l/ ]$ r& }; G0 k7 {
    实例:
    " _$ P1 ]! r! r%对D盘下面的bmp图的文件名进行排序. C: ?. Z. ]) W& |$ i
    clear
    " B0 d. r# L- s8 t/ ]5 F" R# kdirpath='d:\';                %路径
    + m3 v( b- C, Kextname='bmp';                %扩展名. B" s9 w  [& r* E" e" s
    1 w6 V) U# g! C/ @% C
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    ; J* L& W; u- ]: ^! j        dirpath=[dirpath,'\'];1 r# I; X5 b  h+ P. L# C, J1 q
    end
    & r0 o" F# ?; ?1 H# b: k" `; e2 s7 Y2 U2 c5 q2 C* ~
    %先取出目录下的文件信息
    / W3 A; y4 L/ f! t" i5 jpic=dir([dirpath,'*.',extname]);' ^7 }( e4 w4 O! Y
    filename=str2mat(pic.name); %取得文件名4 Q/ a% q4 C; K- u( G
    0 q, C3 v/ R7 h* T9 g8 Y5 \! U3 j
    %调用函数
    " U$ Z. S# n, k! w' }+ esortfile=LengthSortStr(filename)
    ( l% j/ P5 ^3 |8 ^$ G6 O" _/ v- V复制代码4 [) B3 E4 W& F' ?

    + V- y! d+ c1 F9 _- M# |. p3 X0 G) O7 Y, ~% p- Q
    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-4-16 10:03 , Processed in 0.428744 second(s), 63 queries .

    回顶部