QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3142|回复: 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 g) g# I. C3 j
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    * S7 n2 q% h  h+ d& d  o/ l5 \1.jpg! [/ G1 L' z6 W
    10.jpg7 s) z* m; v6 j( u
    100.jpg0 o. H1 D# @* a  @  j. O0 G) i8 F
    101.jpg
    6 }9 b2 B! g7 x就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。; u& R2 O0 O, @" }, i
    % B. h! t( ?: j& u
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。" i4 k+ A% L- r) N4 Z
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    ' M2 b( o/ j1 i/ [0 m如果不是上面两种情况的话,本文就是实现从小到大排序。
    * c' Q2 Y. n+ U# J9 [' ]$ g% f; t
    ) Z+ I5 @9 H9 U7 Y3 y
    ' X7 v7 {' {- ^0 z6 y- V1 d3 N提示1:文件名的获取
    ! W5 f! }7 _. n8 d3 q& ?. X' j通过dir可以得到目录下的文件名,比如:
    # H2 H, {; U! X0 U5 T3 \jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。% r' {; ]1 h& t- B& W7 g( F5 }9 _+ W
    filename=str2mat(jpgfile.name);  
    ! a6 d: r: {4 ]% u2 K  f+ j! }6 e6 m% I! d# J0 Y
    提示2:字符串数组" d: L) e$ m$ f, ?. k3 F0 k( r0 o) N, l
    先试一下:) Q8 w+ ?$ a4 r/ s+ o7 x
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同: y' \5 w7 G$ b: R) }. E
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    % O& [+ T+ V( L5 Z% P. I- Mstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。% R2 U& h1 a8 |8 f

    ) j' y/ q7 F! o" a  y这样就导致上面得到的filename每行的长度都相同。
    % Q2 W8 s& {" ^# i* y
    - ?6 p  y9 X" S5 `; K( y# b7 D5 ^5 A
    本文原理:8 Q. A  @6 ^7 X
    先判断每行最后面有多少个空格,
    0 \( H# y7 ?4 W, X" f- X: E0 O, m" \然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    9 _# t8 F: q' w  j这样排序就可以实现上述的文件名排序功能。2 R1 U" x; M& [9 o  ]: o4 O8 p" t

    , E7 y0 p1 O( ?' ^4 W8 v- Z, `# c! a. @- v8 K7 o% Y
    本文代码:8 {& |% Q9 w' x6 q! [, e
    function varargout=LengthSortStr(str)
    % @4 N; s, \  h8 u1 y+ \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ! `! t2 l- o+ }- H; j' m3 x%Argment:                str文件名组成的字符串数组# W5 i+ q, z9 C( y* w$ h( F* k. Q
    %        :                输出参数同sort函数1 o) p; E- c! k1 l0 w: Q
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" p, g7 h* B+ T5 s9 W- J; n
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    : l8 f, w) h7 Q7 [
    % M, f$ B8 T$ O[N,MAXLEN]=size(str);        %个数以及每行的长度
    9 I& H3 b* l, G' S( vnewname=[''];9 c& a. P4 _5 w1 I( p' C) r& G

    0 ~5 I0 `7 k* afor i=1:N' O* C8 h, n4 Q3 h% o
            BlackSpace=0;
    , Q2 Y$ r1 w6 Q2 \2 O" Y        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格! z9 G$ i; n; V- q2 W1 u
                    BlackSpace=BlackSpace+1;8 }5 A0 A( m2 u. P* k' i# {
            end
    # Q+ L1 c9 j7 N4 K  z0 C" e                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    ! G  G" z# c# ?: d        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];4 ^1 z! i* o0 s$ N! q  d
    end9 m! O/ o! `' ?& ^5 s1 i
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号) d7 K! P: D1 v- ~2 f' x5 r) A
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    ! F# @9 l" H: w4 X3 x- I. t8 m& B+ s: _7 N8 o
    if nargout<=1/ G& ]4 z7 U/ Q: a" g1 O2 O
            varargout{1}=sortstr;3 v! ]9 z8 ^# g9 f
    elseif nargout==2
    % I4 Y5 @2 B( J( M$ |# _        varargout{1}=sortstr;
    / K- b# i3 B/ t" g; \        varargout{2}=order;
    + H. ?$ s! ]4 |/ m7 hend% o% z# Y/ Y4 ]
    复制代码
    & F4 d- j" y" F, p实例:8 D; u0 h: N! Y) I# T4 H
    %对D盘下面的bmp图的文件名进行排序5 B3 h- \# a1 I6 n: @
    clear9 ^6 ], z9 d9 k
    dirpath='d:\';                %路径
    - L! V* \/ y, R! T# s) H. ^6 fextname='bmp';                %扩展名+ j( L! x' U2 T% M; z
    # \- J9 ]/ J4 |8 Q  L( q
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    4 U& r& @9 i4 N  u' \2 A0 F        dirpath=[dirpath,'\'];
    ' k, c5 S7 ]8 E( y* p% w- Kend: Q6 M, K. ]( A$ y0 R+ {4 E7 \

    5 h- K' A1 d9 S. b( I, V  ]' o%先取出目录下的文件信息0 R$ o4 V* y# \/ L2 [+ k8 l
    pic=dir([dirpath,'*.',extname]);
    & V& @8 ?+ G% L  \( @filename=str2mat(pic.name); %取得文件名0 [) s) ?- u! z3 C  f" T

    # r0 p. ~9 ~3 B* A$ E6 n/ f4 Y%调用函数% R2 U- i! n1 O) p
    sortfile=LengthSortStr(filename)
    ) z; G$ ^+ H) G9 S2 m复制代码
    0 h$ c  K7 d7 _% f5 k) k0 l. }! Y. X9 s  F- Q

    % D2 W9 ~6 P/ ^
    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-6-15 01:48 , Processed in 0.464407 second(s), 61 queries .

    回顶部