QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2843|回复: 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
    由来:7 n" K+ p( n4 H: ?/ ^0 X( s% F
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    ! m9 h. S; i9 k( H1.jpg; ~+ ?" P3 r: l5 h. f; h: W
    10.jpg
    2 A% @- i% G- u$ B6 `4 h! ]100.jpg& q; p* F# z: G2 Z6 I2 u, E
    101.jpg/ ^9 c% _8 {" C% T
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。% A* f% }" [. k2 ?+ t3 Z: q

    / v8 |  J, n% K$ b" F当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。) ^4 ?0 I( S; ~
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。& k% Z) M$ _8 A$ k2 t% y" j' r
    如果不是上面两种情况的话,本文就是实现从小到大排序。) h3 o1 X  l7 e1 ^  ?2 o. h7 q4 ^
    0 d7 d9 k2 Z8 y, b& o
    6 X; k$ _- ]$ w8 J+ }
    提示1:文件名的获取$ ]  P3 i, f4 ]: l# m  y9 _
    通过dir可以得到目录下的文件名,比如:# J/ Q$ r) f) x( |7 Y0 D) Y7 S; a
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    $ h3 [2 F8 S) y5 j2 F$ P/ _$ Efilename=str2mat(jpgfile.name);  
    ) Y5 u/ ?% d/ d) y
    ; V, v* _4 d" ^" h提示2:字符串数组+ K9 l/ }/ }0 p( r, b
    先试一下:
    7 v0 k8 I$ Y0 W7 r, X, O1 F( {2 qstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    $ \& {+ V' K& I8 a2 q0 Istr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同  Y5 |) `8 w  e. ~& E) Q! y8 m5 Z
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    ; K8 `' S) _$ p+ r2 D7 J  ?/ ^0 H+ j/ j: l. w4 {  B/ u2 j7 U
    这样就导致上面得到的filename每行的长度都相同。
    6 v5 Z, _+ k3 a6 p4 @4 [8 Y9 _/ \% i" g8 b4 U' T' T1 K
    6 r7 ~6 Y) z* m# v0 w1 V0 C
    本文原理:
    : v2 Z& F: ?! c( @先判断每行最后面有多少个空格,
    . D6 q2 g/ F9 k$ d; o+ w" s/ K然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    : n3 W1 G6 X) ~0 _8 f/ s这样排序就可以实现上述的文件名排序功能。8 Q( V4 x9 _' S! I; L6 m( |6 N! h

    5 s- s  S  c* m0 [" ~: n6 N
    ) x2 g$ f% d$ }) X, {  S本文代码:
    " M6 _4 z# \4 h) J! v% B* \function varargout=LengthSortStr(str)3 F4 V: r- [+ Z2 m! q
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! s3 H% [: j2 g$ ^! j/ G! |5 }8 k
    %Argment:                str文件名组成的字符串数组: `  I7 \1 j3 q% y% \# F
    %        :                输出参数同sort函数* F+ A. z' {; ~% m% N# }, a
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ P- R0 b6 T) E- S
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    : L2 G4 y3 e5 C9 c7 B+ h
    6 `% r# v2 N5 y) V4 h[N,MAXLEN]=size(str);        %个数以及每行的长度
    3 P% u) g0 x, ~' I9 a3 I5 Rnewname=[''];3 X3 \, m' _" y& {
    ! o, b+ e3 `  @- Q* G- i
    for i=1:N
    , f( M6 ~& C7 L: v& f, I        BlackSpace=0;
    5 O" g5 c8 x& f7 P5 a        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    * F7 A' c' i( f" P& a9 a                BlackSpace=BlackSpace+1;
    ' U& L( ]4 ?0 h8 o2 {4 e8 A        end" \. g/ p1 D2 m) s% Q5 T8 t' f
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    % k: n' ^6 M+ u; q; h        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];2 H: R9 F9 ]5 }
    end
    : F8 L. l6 s0 ?  n* I2 G8 F( }4 p[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    & r" A; ^. d% p8 m: {  N9 Xsortstr=str(order,;                                %由这个序号生成原始的排序名8 z1 W1 Z; e( c
    1 P5 l7 t4 k7 t9 C9 J% Z# m
    if nargout<=1% z% O# ?% R7 _: f7 M  X
            varargout{1}=sortstr;/ K* w$ D4 ~1 f% Y
    elseif nargout==2/ }  q# a0 |2 m! \, ]
            varargout{1}=sortstr;
    / p' U% c0 G" W$ c2 K5 ]        varargout{2}=order;
    2 [+ j5 i9 ^8 t$ F* i. c. J' R8 send& k% R7 C; ?0 ~) O- |
    复制代码9 ^$ Y( }$ ~  ]9 n8 Q
    实例:% [$ Z' |. f2 X. o& g! ]$ K
    %对D盘下面的bmp图的文件名进行排序
    2 a% `4 A* ]+ K. I. X2 y% D4 ^, d6 N7 q1 xclear
    / y! [4 {8 A9 w8 t* F9 c( S6 K0 ^dirpath='d:\';                %路径
    8 ~6 v* F: X8 z6 K7 bextname='bmp';                %扩展名
    : l" ~6 W8 f5 H2 i1 K- p' n0 j2 B) j+ [# ]
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    8 R" |( g: G; r  I4 E* s% v        dirpath=[dirpath,'\'];4 D3 T( `: i: b3 J: g# t
    end' c5 q) L; v' v" S% c0 }
    + G( b; C' C# n6 l
    %先取出目录下的文件信息
    1 P* y$ ~  \% L7 l6 V% l9 bpic=dir([dirpath,'*.',extname]);
    " k. a7 {1 Q! Mfilename=str2mat(pic.name); %取得文件名
    9 m! i9 `+ S9 Y" E. j* e; w' c& Y6 L/ w9 j$ \
    %调用函数
    # u; g3 [- ^6 wsortfile=LengthSortStr(filename)( l# E% O1 Q7 a' b1 F3 C3 g
    复制代码/ y% {4 D; r3 ^' S2 n

      y) u6 Q6 R9 {+ ]3 D$ w; N* l0 H2 Q4 w% H' i
    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, 2025-8-6 06:37 , Processed in 0.493305 second(s), 61 queries .

    回顶部