QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3084|回复: 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
    由来:& `" p% k) e( }' M9 J! N! e
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    9 C5 e& }4 i2 Y( ?9 [1.jpg
    9 t' m! W$ F4 z7 U& {) T: Y8 {10.jpg
    ' U: [3 @6 a# ]& ?) V100.jpg# T; j( m/ D* v1 C# _  j
    101.jpg! c- D  e# p& w2 r9 i0 x
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。. z4 ?9 x1 T4 R4 j

    , p. ^# ~$ @4 n: n  B. R- [4 V当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    1 H1 Y7 j* e) s$ I, i/ @当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    - Q% ^( U( i/ M0 [; o' p如果不是上面两种情况的话,本文就是实现从小到大排序。
    ' z+ z& S, N* G& S! i
    ; Y* ~( A& j7 @5 M
    8 h- m$ _# b2 t* ?提示1:文件名的获取. l4 x$ ^7 w+ L2 I; X! y5 l7 \
    通过dir可以得到目录下的文件名,比如:. @+ y3 |( S- ]8 J1 g' h
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。; \4 S! B( ~0 m9 e- v/ E4 z% f
    filename=str2mat(jpgfile.name);  
    ! `7 f& ]$ l* v1 ?
    # s. N2 e& b: M提示2:字符串数组+ ^3 O+ b* X+ O3 R) Z
    先试一下:
      ~  }5 L8 z% D; y8 h3 f8 Cstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同2 d. }& z! M6 |6 s$ s8 ~, l
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同& E7 D7 N5 M, o; I1 k# d/ y2 c2 s
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。, ]. F7 z( s1 [4 v
    6 @. Y, Z2 g9 a2 c- D3 k
    这样就导致上面得到的filename每行的长度都相同。+ G. G6 F8 ?- k' b+ Q) p
    1 E) U: D, m0 @

    $ N' p7 f/ X) j1 j4 j8 a本文原理:. C# Y% m5 [0 m$ i  _
    先判断每行最后面有多少个空格,
    5 T& b( a2 ~, L  [然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    $ a' [& w$ t6 _: m& P* A这样排序就可以实现上述的文件名排序功能。
    ' \! J; _% K$ o: j
    ; n- |$ u1 {4 p, n' R6 \- L# ~' X/ f( k4 I
    本文代码:
    & m1 F, x' D3 V0 yfunction varargout=LengthSortStr(str)
    8 N6 Y5 a$ e& U. G. X5 e- Z6 O' ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; o/ R) h, ^# v
    %Argment:                str文件名组成的字符串数组2 y, h6 \- U  F& u$ i8 f
    %        :                输出参数同sort函数* H+ i$ T3 C, H  t8 P* M7 |' e7 d. D: m
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: q; N4 a% |' T9 b* l* z
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好2 j: B! ^5 q- @$ b% B0 K

    " R8 {$ S) a, v[N,MAXLEN]=size(str);        %个数以及每行的长度
    + U$ S; ?& w: G) T6 ~newname=[''];
    & `& K% u2 A, N5 \5 L9 I
    7 Y: O1 @' q' I1 N3 r9 I! T$ V9 tfor i=1:N& T4 E7 q5 h1 x/ l
            BlackSpace=0;
    ; E8 B8 [6 p8 x& j0 }        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格3 C8 E  X1 Y5 c
                    BlackSpace=BlackSpace+1;
    - [: B- N8 l6 N1 y5 F, L* W0 ~        end) j% H: y' }" {2 f) c
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格0 t3 _# q: i7 [7 P6 Y" {. f& n
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];0 {4 w$ D" \8 U7 \
    end! J7 A' i( i5 @! r
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    5 @* b  M* [! a, k, csortstr=str(order,;                                %由这个序号生成原始的排序名
    1 W3 |1 |1 j2 ^, y8 D% u2 J
    ) f7 a3 e$ m/ V2 }; fif nargout<=1, I% W  B1 W$ G+ I. |5 X; Y' q( Z
            varargout{1}=sortstr;: v7 _  g7 W. P& b9 T9 z
    elseif nargout==2
    9 R9 o% D% R+ @% P) }        varargout{1}=sortstr;
    % Q7 n% G: }9 ]+ |( }        varargout{2}=order;" ~- u* p5 U* H6 |9 q
    end' N( Q! P9 [! N% U
    复制代码) _# w  p& R6 ]' q, `4 [- I: r* N
    实例:. t' m  {" [& S, ^. K+ {* Z
    %对D盘下面的bmp图的文件名进行排序4 _3 R1 r: [0 {0 o/ G% b& s, C
    clear
    ( V& y4 {( S( }7 I) ddirpath='d:\';                %路径' Z6 S0 o$ h) B! \
    extname='bmp';                %扩展名! F) Z" l* a+ ~, ?2 [4 x2 R
    1 x+ x2 n/ U4 ?! r
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    ; n, [* {# u+ g- z2 V/ P/ j: S" E        dirpath=[dirpath,'\'];3 w1 r* ^& K) r7 ]+ [# [
    end
    ' I' R$ F, E& A; U, u: K% w& t% O) Q
    8 [0 f; l1 f) _' ^%先取出目录下的文件信息
    , e6 |$ c, Z) p3 L0 t) ?) Spic=dir([dirpath,'*.',extname]);
    ; V" O5 v/ @" W/ q9 Y7 P# efilename=str2mat(pic.name); %取得文件名
    ' _6 v( t! }( V' j4 n+ v+ t+ ^
    $ M! m, P, b) j%调用函数' ^& m! \% G3 p9 H( j
    sortfile=LengthSortStr(filename)
    8 K8 ]6 c% ^: _0 T- S2 P, L复制代码
    3 a( `1 z. t! s: ]3 ~1 {3 }8 e+ w. V  ?9 e: R( }# t
    1 [/ ^. [. c  C: C% r1 a: l- s4 s
    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 07:09 , Processed in 1.376076 second(s), 63 queries .

    回顶部