QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3159|回复: 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; Q; o# k* M1 j; Z, m手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    ) u; B, Z" W& j; p7 E1.jpg2 l! [- D- [. u
    10.jpg
    & P! m3 _$ F5 M9 Y& X: o- Y100.jpg
    / B( }& j: c+ }5 i0 q6 c( N# _101.jpg
    " r; c; B( p. F) K# {就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    % {* A) P  G- c5 R" C
    # w* D+ l/ W, v+ K5 H# B当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    : Q- Q3 G0 C# h* L当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    - ^, A' \- F7 N8 q# H如果不是上面两种情况的话,本文就是实现从小到大排序。' L' g6 ?. N+ a  N% ]) [2 W
    8 G, k0 r2 J# ^0 B- j/ m$ j

    9 p8 X& {8 X2 W提示1:文件名的获取' W6 q' K. s- ]0 v
    通过dir可以得到目录下的文件名,比如:
    # c2 B# q/ V+ [! ^5 _jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    6 a: F' v/ |$ `* v8 Pfilename=str2mat(jpgfile.name);  
    3 e( G4 r; j0 [* `* A4 ^8 \" e2 @$ ~! q+ w
    提示2:字符串数组
    & H6 D7 x8 Z: y7 S. p先试一下:) b( B; c3 {7 c9 W0 ~
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同8 W; P1 C: X* l0 a1 E+ e
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同! [( m; `+ l4 s( ^( ?5 {3 h
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    $ Y! O3 J6 `2 U7 G8 m% m9 U) i
    7 J" ^/ {$ i$ Q" X6 r( e6 ?9 G- P这样就导致上面得到的filename每行的长度都相同。- L9 \+ z( J+ B3 z7 d. O
      Z1 z) ~( ^7 S9 U

    % X2 j- Z4 D/ d% Z3 o: }% \本文原理:
    4 ~( J9 W  `7 v8 r5 g先判断每行最后面有多少个空格,* {6 `- r2 ?$ c* C, K; J3 s/ J' o
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串" @4 J! @  ?$ ?1 `5 m( X
    这样排序就可以实现上述的文件名排序功能。
    2 x& Z6 y) F0 _. U$ T% ]& {
    % H7 Q$ a/ s2 W( j& C* x& @7 c4 E% B6 y1 }+ z6 z; ?* l2 g, A
    本文代码:; s" c& a% q  ~# P
    function varargout=LengthSortStr(str)
    3 O, v- R6 G- B, F' l$ D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ) B: |+ @- m. }+ P$ k6 G6 s2 c0 N& N%Argment:                str文件名组成的字符串数组
    3 I. h% T6 f, g- ?$ o0 Z$ C%        :                输出参数同sort函数7 B, T2 r' T: w) U7 X: {, {; }
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! i5 U* E$ o. D4 I8 W; O
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    / i! M. J( V9 H4 _1 |
    : ~+ Y& M* c# x2 N[N,MAXLEN]=size(str);        %个数以及每行的长度
    3 U# K8 t5 f+ a& s; T- f6 b, b% N- Ynewname=[''];$ G8 F; W  I& @, U; H
    1 B/ G8 c; b. d8 P) j, E
    for i=1:N6 Y( _4 f( k$ G6 \
            BlackSpace=0;, \+ ?1 z- {* i2 I' D* x4 u$ l( o
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格$ I# _( m  w) M6 D3 o" X
                    BlackSpace=BlackSpace+1;& x* K! j$ O8 T  ?& G
            end
    $ {7 w8 _. X5 [+ J; |8 t                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    ) ~) t/ a  G) ~" @& J7 F        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];6 ?! C* d/ f! U8 g3 S
    end5 Q, b4 M! j9 d4 M9 A1 p
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    ( F% h' w- p( Jsortstr=str(order,;                                %由这个序号生成原始的排序名
    6 ~  ?  d: z# }: K4 m" ~! F
    * z1 }2 S) [- J$ G- ?1 xif nargout<=1
    + y! v- g% e. H4 @& X) V        varargout{1}=sortstr;7 @; h( c& s, F3 v4 V, H( s
    elseif nargout==2
    : p4 X- H7 J- F; R& J+ E        varargout{1}=sortstr;6 ]. ?1 `& G, N# y: y& Q
            varargout{2}=order;/ ^; T0 C; x$ w
    end
    ; O7 E; H; H( Q; T- z1 F9 V! k复制代码
    " J, A& f+ B5 y, b" X: i8 h实例:
    / ?2 [( R; v  L3 O8 H  G& Z9 t%对D盘下面的bmp图的文件名进行排序3 r2 r( a3 n, [
    clear
    & ~* v7 d9 s3 C+ s7 ?4 l4 I7 ~dirpath='d:\';                %路径
    " s9 A4 a8 K4 D) Mextname='bmp';                %扩展名
    5 U. E9 Y& v/ U7 g$ N
      a  V8 H: ^& j( \  R* d7 nif dirpath(end)~='\'                %如果路径后面没有加\,添加3 K, s! n, b" K/ }1 l; L) }
            dirpath=[dirpath,'\'];7 \; _  j1 {; p3 R. `$ [6 a) n
    end
    9 j3 J( e9 n- @- g1 g- O! z
    " l# H" Q7 y) m! o9 h%先取出目录下的文件信息3 ^# n# O9 ~3 E) E. l& ]! d0 n" A
    pic=dir([dirpath,'*.',extname]);
    # m* J4 ^" k' t; Z. tfilename=str2mat(pic.name); %取得文件名3 ^& Q! i! f7 |5 }

    + C- m: P! A) Q! j0 C* G6 @" ?%调用函数
    ! e: U6 S8 l. _3 q! X; m; P0 b. bsortfile=LengthSortStr(filename)
    % R) f0 |3 h: _% F! [% g6 B复制代码0 O5 b+ \0 \& T7 p
    - G  H& j6 G  @6 u
    # I( E9 U/ [  a$ h/ g3 F! l
    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 23:22 , Processed in 0.290137 second(s), 61 queries .

    回顶部