QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3205|回复: 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
    由来:
    4 n) j9 ]( ~2 e手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    , T- b1 F8 f: q: s5 H! y1.jpg
    % ^! w  l+ T" f4 i7 _& y7 b10.jpg
    8 d  T$ O, s' Y! K% ?4 t9 d4 \! M100.jpg
    , H: r: _) W$ }: u$ ~101.jpg
    2 i. |  ?6 e& h% f% b' [/ Z就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    $ n- L. S, @$ z, B; t! L7 _* ^# B2 a' f
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    # V, y0 F; {$ ]/ [) R4 L- F& \' X当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。/ e& B/ i% R! k. g  T
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    ; c7 `' x0 w6 r5 l; p- p
    $ U5 O: s9 b7 `* d, ?/ `5 A( L" }) A, i' g% F" x
    提示1:文件名的获取4 T" k6 J) O5 [
    通过dir可以得到目录下的文件名,比如:
    7 w# v( Q# `: C  ?# Rjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。8 z$ Y7 Q' U: n9 f  ^9 @) n
    filename=str2mat(jpgfile.name);  
    6 M9 ^- |' D: ?6 F4 {+ J* ^8 a# x) x: x. l
    提示2:字符串数组: K. V9 P# o, b& `% A/ q. R
    先试一下:7 q- b1 `+ i3 c3 P) T
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    * C' `+ a4 l  ]& a8 K% R  wstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    , l. k- t, i8 Tstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。2 a$ [0 h5 {# k3 G7 j; J2 j) c
    4 ?8 x! B, Y0 m/ d: D; [
    这样就导致上面得到的filename每行的长度都相同。) R/ D. N5 b" {' ], I, n3 g8 P

    1 U& }+ U! K" U
    . `/ y5 V, U- M# Q% ?. m本文原理:
    " F# |1 h$ q0 W* d1 ~. u先判断每行最后面有多少个空格,5 N) i+ w; u% F; N
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串* h+ [5 _! s' H% ~, s1 Q
    这样排序就可以实现上述的文件名排序功能。( k4 b7 }- S9 d$ y" e9 Z
    ; A( s  o& a( n& f4 o
    " B  r2 y: F1 m# ], f! J3 i0 ^
    本文代码:
    : \2 j% R  p# @' M2 ]function varargout=LengthSortStr(str)0 E7 F+ b- F- S+ N1 K+ Y
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ }; ]0 `& F% m0 m0 T) l
    %Argment:                str文件名组成的字符串数组6 L6 q& i7 ], E$ {# D
    %        :                输出参数同sort函数7 l. O4 P1 z2 T: g2 f, N
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    0 i0 K7 U3 |9 h. M6 Xch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    % M* |& W/ A1 }+ S% ~
    6 Y6 p0 A; o8 U# Q4 m[N,MAXLEN]=size(str);        %个数以及每行的长度/ S$ S! N4 T+ w' h
    newname=[''];
    " e6 e; _9 n' ]( F6 O+ T8 L( Z: f! g
    for i=1:N
    ! s5 A- z8 w9 N) {8 `        BlackSpace=0;
    5 c2 z. y( m$ Z, v4 d        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    % ]/ f& T5 L0 d# V. K8 f" w& S: s                BlackSpace=BlackSpace+1;$ T# `' n9 V% V4 @% ~6 I
            end" ~. }  d5 J; X" \& g8 V8 E( J
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    - n$ o( g3 T3 n1 k- o        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];! b0 e! |0 h- G( @
    end- {  {6 ~8 A7 T! G' v9 p7 W. E
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    * S6 o+ |5 t8 f) A4 L8 lsortstr=str(order,;                                %由这个序号生成原始的排序名
    + a5 c" @' C0 a( @# V
    . ^  C+ i- N' K2 ~if nargout<=1! L; s6 L5 ^1 s" J
            varargout{1}=sortstr;+ i4 t6 \; S$ Q. t: r
    elseif nargout==2  P" @% G6 Q* h- x6 Z3 h* Z4 Q
            varargout{1}=sortstr;
    7 f- G3 x, z! ^8 u3 @        varargout{2}=order;6 J  b# k/ u3 m' Z7 u- F2 y
    end3 |0 i; Q# d9 e0 ^
    复制代码/ [8 o& k5 S5 Q
    实例:
    / w& ^. o% m* O' Z0 K4 m+ ~%对D盘下面的bmp图的文件名进行排序5 S# S3 f' `: [) Z; c7 M5 [
    clear
    0 |8 N# E3 i$ P/ v7 R% mdirpath='d:\';                %路径* O: M/ [+ k. f; R1 y
    extname='bmp';                %扩展名
    % G0 _, A- l& s9 G8 l; ]
    & r% w* [( c4 v( Aif dirpath(end)~='\'                %如果路径后面没有加\,添加
    6 ~9 O8 x5 ^' U        dirpath=[dirpath,'\'];
    ! R0 C% `) _( I; s; O/ ?9 i( _. pend
    & Y3 h" a$ P! V3 M
    7 x0 C- N9 T2 s0 C: \: K* U%先取出目录下的文件信息  W' Y, j+ K* h- X7 x6 S/ ?: h
    pic=dir([dirpath,'*.',extname]);
    + v% Q# R( z. p) ]" W, r% Cfilename=str2mat(pic.name); %取得文件名0 O4 {0 V& k: S9 p# }; ~# j  `# @
    6 L4 {. j6 h5 C/ z7 r( p7 R8 S7 a
    %调用函数: g$ w2 h0 k+ j" g$ G+ _8 X
    sortfile=LengthSortStr(filename), A7 [& |8 W. l+ A
    复制代码
    / p* M+ K2 b  N
    5 V. \. n8 i) l$ R- {+ R
    7 [+ d2 Q8 T. y7 @& o: ]. j
    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 20:54 , Processed in 0.286583 second(s), 61 queries .

    回顶部