QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2717|回复: 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
    由来:( Y, [9 A2 x# D- h. j
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    / w, g- W1 C0 W! g9 ]1.jpg
    ' ^5 s$ x& \  `/ M$ t10.jpg! L! k) Z1 H7 |4 J- E
    100.jpg! j, d# @  N+ k- h
    101.jpg6 i- [8 X$ i' I1 v* a+ E2 s5 P( r1 {
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    2 }0 C' y' y. D' k8 Z9 x  m1 V, m  t& I( _5 F# Y7 _8 D
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    / n4 M( R2 E# J+ o当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    : S6 R/ O$ v& E, I  e+ T6 T如果不是上面两种情况的话,本文就是实现从小到大排序。
    7 }; i. }) r- _. p$ M
    % e0 C7 x# ^2 T* ~, R
    9 t+ s) `1 [9 p% V提示1:文件名的获取
    & ?9 y' y3 O5 H; H% W- V通过dir可以得到目录下的文件名,比如:$ U* K# Y6 c6 j
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    / x& e. \) g# n8 ufilename=str2mat(jpgfile.name);  
    / N$ ]* b. m: X6 a0 G
    9 F( L& O: r1 K3 g- C8 W提示2:字符串数组
    0 ~3 @; [/ e) J1 i9 A先试一下:0 X4 Q  `4 k2 c$ P  Q* _. [
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同. K8 u  I* b; E5 L) u# j  }6 X
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同' V( n* r5 q9 L: p! P$ F
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    8 Q* ]+ t7 E+ h4 b3 l
      Z- U+ y8 ^0 H/ i2 Q这样就导致上面得到的filename每行的长度都相同。
    4 S' ?% x3 Q9 _8 a% u# K
    8 W, N4 [8 r5 v: D0 K( D- [! Q; @2 ~. N: B( S% Q
    本文原理:- v2 E2 o5 Y1 K1 r" n
    先判断每行最后面有多少个空格,
    ( Z4 m) Q2 e5 n) P6 C) [' C6 C然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    2 _8 J" G  L: g: U% a4 W这样排序就可以实现上述的文件名排序功能。
    - z$ r. L: J" @8 ?0 g( Q$ _! M$ o- f3 \  f" ]/ o; h8 P- P

    3 [2 ]2 a" W% _/ d# P1 I本文代码:5 C' g$ l6 {# ?7 @- F+ g
    function varargout=LengthSortStr(str): Y7 N0 H- M( B) K
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    - |' W5 |7 l7 d! I" |/ r" T%Argment:                str文件名组成的字符串数组
    * B$ Z( s$ Y( _0 D%        :                输出参数同sort函数% e! h0 j7 O, n
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      V5 A  z# Z: }7 t% L$ ~; a! uch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    2 T: v' }+ Z5 p: m4 _$ H9 `- S7 g+ f5 |) b. e: o( Y
    [N,MAXLEN]=size(str);        %个数以及每行的长度; B2 D* [5 x3 o1 r
    newname=[''];. G% }  v6 u* y+ @. U/ f& r9 A4 _

    ! ^" A+ O6 |1 G, i( Tfor i=1:N
    0 g( P& ^' T2 [& C        BlackSpace=0;, a3 G) B3 w5 q' @
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    ( o4 ~  F/ d9 o                BlackSpace=BlackSpace+1;. S5 Z3 y2 Q1 o1 Q6 ^
            end" R! \2 [+ b3 C- a
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    , D+ \9 {' v% t1 ^1 N        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    2 t5 F+ J9 @' z, t, V% Dend
    3 _" l% \5 `: V3 p) j) ~5 n[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    # L. R" y1 E1 O8 N6 N7 csortstr=str(order,;                                %由这个序号生成原始的排序名
    * [! _' r0 h! D/ D& B, W1 G9 @! S6 w0 o1 M
    if nargout<=17 u& h1 }! x  d
            varargout{1}=sortstr;( s- ^6 C0 b9 o! X* `0 a
    elseif nargout==2
    $ K( J& h" N' V' V7 H8 O( i        varargout{1}=sortstr;2 c9 ~' t3 ~. T
            varargout{2}=order;2 h3 S. u& x# ~2 N
    end, S- I( i' g' z% u
    复制代码* I  i6 J1 B2 G& t( q2 J
    实例:- d) [3 q5 f( N+ J1 ^
    %对D盘下面的bmp图的文件名进行排序
    4 @  M) r% O+ c/ h& F+ K  wclear
    ( \9 g% ~. C2 t/ F5 U& u1 @0 ]dirpath='d:\';                %路径0 x5 b4 r, A/ }. T: @* q$ y# I
    extname='bmp';                %扩展名
    4 h1 v! h1 |* M+ @6 [; @$ ~( R8 O( Z
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    3 p9 ^1 S& ?0 S5 X1 I# u        dirpath=[dirpath,'\'];7 g) n# X3 r, G% o0 F) K
    end# i" ?4 N/ v* D! Z: z' R

    6 I  |* A" ^& M; U) s* ]%先取出目录下的文件信息2 [5 h! I+ t, |# _6 S) v& M- L
    pic=dir([dirpath,'*.',extname]);
    % }; }' A7 w/ v" ~! Hfilename=str2mat(pic.name); %取得文件名3 F8 u/ }5 c7 d; z4 A/ C

    2 w& D$ _# |7 J4 Y5 |%调用函数. p3 P2 w* k; b
    sortfile=LengthSortStr(filename)
    / \: D) H/ V3 T$ d6 y7 n9 I复制代码3 i: h, ?9 r0 T

    8 |7 h3 e3 }% I$ N
    8 l$ _, D; d" O% K* `" D$ 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, 2025-6-11 11:58 , Processed in 0.859061 second(s), 61 queries .

    回顶部