QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3157|回复: 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
    由来:# c9 B* Q# [! z# w. W4 {
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是: t" ^8 b7 w+ [; s* e
    1.jpg
    ! i( a( |" \( g' ~, o7 r  k10.jpg
    / ?, O( b0 X" k3 I$ c0 M100.jpg' t" m# q9 X' I5 m
    101.jpg
    * j9 A/ R6 T' p就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。* s! x* y5 m: Z& v! ^0 M

    3 z$ `$ X  ~" t5 m3 A# I  @" a当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    - L; S  u& A) @# T8 i$ g7 ^当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。- }) b/ n, W8 l! q
    如果不是上面两种情况的话,本文就是实现从小到大排序。& \  Q9 f# g4 [2 I

    ) ~3 c; J8 E- G8 j! p- \3 }" l- R# N: t' e) S
    提示1:文件名的获取
    ; {* O: s, n8 q4 p* a6 {& ?  t7 l! _通过dir可以得到目录下的文件名,比如:
    ( ]; J+ _7 M! E/ P( R, ^1 N) rjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。! @4 S- w) F* [; h) ~2 Z
    filename=str2mat(jpgfile.name);  
    4 h$ v9 v3 m3 s- b1 i) J- |
    - `% ^% s' G8 v, ^* x, n7 R提示2:字符串数组
    " ~4 F) r% z6 }' \( q' C. {先试一下:# U. @  \/ ~; d) W1 t% {7 I
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同& j1 ?( h$ b- b- B4 u
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    * f2 x) K1 m( a* b" L0 [- s2 y: xstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。& J+ ~& f) Y' ?4 v6 k& r  {
    ( f( Q5 J- s* o  I) R
    这样就导致上面得到的filename每行的长度都相同。
    " Q. k) D5 o" N! W7 ]3 |& a+ E3 R- d8 \: u
    % z* t+ X# @( ^' X+ r2 W5 w! A1 [
    本文原理:
    + E0 ~- u9 K9 S; p4 a% y先判断每行最后面有多少个空格,# i' b% {- h9 G
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串# ^- j8 e/ ~3 v6 ?+ d" q
    这样排序就可以实现上述的文件名排序功能。
    ' E5 L: l5 o( ^' K
    : ]! v2 `3 a! y5 F  N: J9 y" a1 l9 Z, n& j
    本文代码:
    & v1 `# |% C$ a8 jfunction varargout=LengthSortStr(str)
    6 Q2 ]$ ?3 [7 u! K; @2 |" T/ o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    8 N5 k+ t+ b4 W6 [%Argment:                str文件名组成的字符串数组( Q- r7 Z/ c9 G  V$ `
    %        :                输出参数同sort函数
    7 I1 J4 E+ p" B5 u. v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    - R8 x0 _! n' Y! |ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好1 q" j- i- A5 d0 R1 W! t

    + J9 M$ S7 V3 {& C8 J[N,MAXLEN]=size(str);        %个数以及每行的长度) C: S, r9 N% A: X
    newname=[''];) W8 `; r# m$ u8 v

    6 U3 q2 Z! ?' j4 A* ofor i=1:N' p2 t7 l' L: {( A+ z
            BlackSpace=0;
    ! w, y! ?5 e; s, c5 k4 p, g        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    , U$ Y, q9 A9 l3 a! Y                BlackSpace=BlackSpace+1;  L6 X/ H/ }0 W
            end) _# f$ S5 a3 V/ ~8 e
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    ! L6 x; c; [; M4 `) I  g        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    5 f- Y! v9 Z2 C; ]  p3 h$ y' xend: x6 p$ C. f' T3 v! Q) c0 j1 g" O
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    % S9 {$ B% G! X+ c8 G* n( X! q# jsortstr=str(order,;                                %由这个序号生成原始的排序名$ V" _- W- }! e4 X* K. }- @. j0 g

    ' k4 a* C. c! ?4 Z7 jif nargout<=1
    1 D( \3 G4 T; f. O/ ]        varargout{1}=sortstr;! U: P4 s4 o, R9 T- m$ m3 V& |. M
    elseif nargout==23 \2 w4 R1 }! ]2 F3 R# J! p
            varargout{1}=sortstr;, u# l, Q& b4 N7 v  c8 P  d8 A+ v9 K
            varargout{2}=order;
    2 K4 `% K& }, S6 v) w# f0 E' m, rend
    8 r, H! j) [0 |8 Z* W8 t0 k& z. a复制代码
    0 Y/ J, O2 V8 b* B4 t实例:& V: X' x, }; ^$ M
    %对D盘下面的bmp图的文件名进行排序
    / W4 N+ a$ Q0 W2 Uclear9 @5 n5 L" R* l. K) U
    dirpath='d:\';                %路径! g9 E: E( W! X; F9 ^
    extname='bmp';                %扩展名  q4 T( T. B4 Y/ j/ b) e
    , E4 P7 K+ l. k: E  H
    if dirpath(end)~='\'                %如果路径后面没有加\,添加+ j2 M* G- F! L3 T; s
            dirpath=[dirpath,'\'];9 S; r2 u( ]1 \0 p0 m6 L$ L& w
    end+ X/ i' M" S' L9 J) J0 d* [$ h

    ! C, q0 X+ L8 q" J( K! U% E$ p%先取出目录下的文件信息3 x7 p- A1 C* c0 d1 e6 s. j; P% K
    pic=dir([dirpath,'*.',extname]);# F( B+ @3 [$ v) S# d
    filename=str2mat(pic.name); %取得文件名
    * j0 Y. Z1 s7 I# ^# P, ?* ?0 m4 P+ N6 F( A
    %调用函数
    ( k# D9 r9 d; j1 ?4 W. `sortfile=LengthSortStr(filename)
    - T- N0 W6 f5 x复制代码
    1 y% Y: F8 E0 q, U6 @! u7 j
    1 `2 `+ y# \2 G+ q
    + ^# }% ^" I! u4 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-7-30 19:11 , Processed in 0.418709 second(s), 62 queries .

    回顶部