QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3131|回复: 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
    由来:  f: M" M) p+ h, r9 I" k0 \
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是# [5 G" ^+ A9 X" D- Y  F; n
    1.jpg
    " t& N4 C9 K8 K10.jpg
    9 R6 @' y0 O7 k100.jpg
    # Y' r$ X: I$ U! Z101.jpg$ t6 o' r8 c0 _. K' T7 b
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。7 @* @5 a1 \- @9 U# `1 K

    $ Q/ a: P1 w5 M8 j; ^当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。! G, ~  |& L* a' q' }1 m3 d
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。1 |9 M; Q! T+ m; `/ \
    如果不是上面两种情况的话,本文就是实现从小到大排序。* p2 ^  |5 B- E5 `; X" Z$ Y

    4 L6 ?2 x2 }1 K. b2 n" T
      K6 O0 D7 {% Q6 Y0 L. h0 e% ~, o- c: F提示1:文件名的获取" R# @& _' {( s7 Z! h( ^
    通过dir可以得到目录下的文件名,比如:
    8 m: m8 i9 W- e3 o" s/ |jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。1 D- h" B0 p$ |( c" ^; q; N6 ]
    filename=str2mat(jpgfile.name);  ( t( g; Z1 D) e% Q* _

    - w# a" p6 w  w; t& x提示2:字符串数组
    + f: R" S7 u# L0 D6 Z2 _# f先试一下:  ]( J$ [% ]  r$ T
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    9 S9 t) {  m, c% u, U, rstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    $ z& F. j5 L) Z: n- X( h1 pstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。8 @1 O( B* r$ A5 Z; _/ \9 h9 g' O

    7 @: U$ A, z2 a这样就导致上面得到的filename每行的长度都相同。0 O/ \  L0 E- D6 t

    , f- x6 \0 c7 M3 C( y( K
    3 E( n( @' \; |本文原理:
    ) J  v7 K7 q! O2 ~% O4 B6 M" b先判断每行最后面有多少个空格,
    ! x9 f' y& K8 e  w# g& B' v然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    ( f. h) n. O1 s* Z6 u这样排序就可以实现上述的文件名排序功能。9 w& [# e, H3 X/ q/ c2 a/ R  j
    2 A: e- B6 f  e) p% h. |! R

    , ?+ t3 A& G4 A" a/ G0 C本文代码:; B0 z+ H* W; S! e( p7 u2 @
    function varargout=LengthSortStr(str)3 V* C% p$ B5 P. o  J3 O7 Y
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& c* h: j. K# i* L& g$ w
    %Argment:                str文件名组成的字符串数组
    + x) v5 N" Y* w! z  R# m7 ~%        :                输出参数同sort函数8 ?3 F5 O1 ~* [+ E
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 V0 B4 ^/ ]' r
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    0 ~! j& @$ D6 w% H( r6 U+ {9 g0 ~0 D
    [N,MAXLEN]=size(str);        %个数以及每行的长度( t5 u0 _- Z+ S
    newname=[''];
    4 g$ o: j( W1 Z) d0 [
    2 O5 y# z+ G$ |8 p5 nfor i=1:N
    $ e9 ^0 t" o2 T( ]' A2 H# u/ h; ]# S        BlackSpace=0;7 i" s" a3 O0 L! Z) ~/ @
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格2 _. _& Z* e, u/ i$ P7 _: ^
                    BlackSpace=BlackSpace+1;" ^4 f* w$ i2 D
            end% M5 f5 T+ g$ W
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格7 B8 `3 b" H2 e! W2 G/ S
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    7 [2 Z& K5 c1 w9 C8 kend& n0 ~7 E; @1 o- S  ^, ]
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号4 a- g+ Y7 {6 H
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    % k4 V; N$ @! Y
    9 S  X, C. d. Z' uif nargout<=17 i1 {! d9 h1 c# F8 d) V. x
            varargout{1}=sortstr;
    - \9 ~9 E: R% X9 o8 W" l8 S: s* [6 Delseif nargout==2# \- G  k  I1 x8 c
            varargout{1}=sortstr;/ E! z- p! L, K6 }
            varargout{2}=order;& F2 T  G5 A# ]5 q
    end
    - m8 I5 y1 M; r复制代码2 u" z: P9 z9 z" m" N/ g
    实例:
    # z9 I0 i0 l" r; S1 ~! D, C* l( u, g%对D盘下面的bmp图的文件名进行排序
    1 i  m  i$ |5 i& B0 h' }clear
    1 j. R* b$ O/ ?dirpath='d:\';                %路径  }/ Z& V; o! p2 J# I
    extname='bmp';                %扩展名
    / ]! _* b( m% M" k7 |# C
    0 {! k( n4 ~8 ?# d/ n& w" e, Mif dirpath(end)~='\'                %如果路径后面没有加\,添加
    $ N( `# e8 @5 O8 ]% {3 X; _        dirpath=[dirpath,'\'];
    7 J) _: n2 U4 t2 Cend
    / c0 n. k+ E% e  Y9 J
    5 g+ Y5 J* Q% s: X- j2 t0 h, T%先取出目录下的文件信息
    " e3 X- u: d  k7 H8 Cpic=dir([dirpath,'*.',extname]);
      H- a# q, w3 a9 ^: E% Jfilename=str2mat(pic.name); %取得文件名$ g9 ~+ F; l7 \) Q7 J0 G9 t# D

    0 ~9 O' f0 g$ q. n% K  V5 ?0 [: o$ V%调用函数
    - S9 Y7 b5 c' n- a% x' x( J( xsortfile=LengthSortStr(filename)- k/ L! \- b4 ~- R
    复制代码  |! S9 a9 |/ ~! k: L2 w; Z  x

    , m( x4 Z+ s5 I4 l; E! E9 k# q2 K8 J. q; Z
    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-6-11 23:33 , Processed in 0.399300 second(s), 62 queries .

    回顶部