QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2815|回复: 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
    由来:! n. u; N* i! c; q7 V! n. o
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是8 ~9 R8 U3 i. B5 h" b6 ?
    1.jpg
    ; M6 J8 ~. p( o3 S  L0 A10.jpg
    , e* P1 G) C+ Z8 ~100.jpg! {; @' X! j* [7 ^. Q
    101.jpg% N: {( P9 {3 I6 F" ], U, p
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。8 Y4 y6 E, I; e- I) \5 ^' g
    * M& L. _. r" A: l' j
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    7 L: ^; M0 {1 Z7 D; s, ?4 d" O当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    3 i# d. R7 {* T6 T如果不是上面两种情况的话,本文就是实现从小到大排序。
      ~7 {4 K) k* k
    * M: b% s" @5 L6 H3 v( u( f6 p4 g! |6 T8 Z$ @* }' R
    提示1:文件名的获取
    : P8 A2 Z9 ^+ k1 d8 Y( v通过dir可以得到目录下的文件名,比如:
    & F0 _. V, g& r: njpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。/ L) ?$ a' o/ X* T* r5 w
    filename=str2mat(jpgfile.name);  ( t9 }* X: i$ _/ Q& o. J6 [) R

    & R. w5 R3 H9 ]( G) r提示2:字符串数组
    7 g% x/ }' Y  n* g8 D+ [) K1 R: l4 _先试一下:2 p/ ]3 L  q' \: f  P
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同6 K* \- I' M' B6 ?' o- z! L
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同1 @; q7 G4 \# H" Q' g& a
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。  x& B! I# K' ?3 p3 J/ O

    4 a& F6 g. X& J; s5 b这样就导致上面得到的filename每行的长度都相同。7 ]# o" K+ x' K

    9 P/ v5 [4 ]/ }2 L& Y- b* E! x. V" E: t& f2 O& r" Y! M
    本文原理:
    0 m: D" f8 |( E0 W- t先判断每行最后面有多少个空格,
    : \8 R: W- M- G3 s2 M; F然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    ) p& ]1 z8 J! @这样排序就可以实现上述的文件名排序功能。7 Z2 |6 @0 C1 T) H, b! _' S

    / c7 K* q* e$ V' J* A) `; Z! w6 I, ?9 v" W8 }
    本文代码:0 I$ G# H( W6 _- |: E8 d
    function varargout=LengthSortStr(str)
    9 T) o7 k  G* y: `* g6 ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%( j/ }: y7 {9 f8 K* v$ _
    %Argment:                str文件名组成的字符串数组
    ( S) s/ Z: o) i( P, I%        :                输出参数同sort函数6 _, N9 J) P8 V. a) w
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    / k2 y4 C5 O2 w% ?9 ich_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好) y9 I+ D" X; _" E8 Q; Y
    9 V* Z" n/ Z+ g' v
    [N,MAXLEN]=size(str);        %个数以及每行的长度; A0 {& p: U: h1 l8 s0 Y: f$ }
    newname=[''];
    6 {( Q/ y( c3 N$ [
    % d5 y0 J+ w5 K, f6 }% u! g# o+ nfor i=1:N% H* b5 ]! @: P1 V6 r- h+ E
            BlackSpace=0;6 S$ s$ n7 H6 O5 f  ^( J7 P- x0 e  |
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格! S# u0 h; R5 f6 o7 r  M$ E, i9 G
                    BlackSpace=BlackSpace+1;* t9 t; ~1 t( `" M4 d0 ^/ C' B
            end
      s3 j2 I& }& e2 d; V1 ~                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    $ W+ W& |# X# O. D        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    6 E. }4 p& g2 U! cend
    5 j- C) c; n7 f/ V& s% G  u, B[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号/ A2 I* G! v3 v- e2 ~. K: }0 R7 ~
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    2 ?, v) N2 U. ?4 b8 ^' W6 R+ }) l
    if nargout<=1
    3 a1 z( `% _! j" I% T# e% p7 A        varargout{1}=sortstr;
    3 ]0 _# _+ a. {* ~2 selseif nargout==2
    # Z# @% m/ A* k/ Z6 h" R        varargout{1}=sortstr;
    0 O/ b  f, l% z0 Y2 b# A( n8 n& v        varargout{2}=order;
    ; C# ?7 }* M1 T! P7 {. hend  c6 e6 K5 L+ \4 p4 F
    复制代码
    0 h6 }% ]6 N! I; J; o+ ?实例:
    8 J( r; S3 ~, u& u) b%对D盘下面的bmp图的文件名进行排序$ j* B* \8 K$ Z8 k. L. z( j
    clear
    $ d" f! e" t- {dirpath='d:\';                %路径, @; w2 E2 F. {4 y. t
    extname='bmp';                %扩展名
    ! f: [& c0 |0 i' \+ S4 V( h% _6 c6 ~* w4 B3 `
    if dirpath(end)~='\'                %如果路径后面没有加\,添加9 J7 y0 I' ?3 s+ t( s% {. f/ W
            dirpath=[dirpath,'\'];
    7 D0 q) j& h: P9 W: i7 l- x+ y  Y  Wend
    - W$ `7 Y. }% g0 r2 w! h9 O
    0 ~7 W3 a/ i/ U% ~%先取出目录下的文件信息' s. z/ ]: i$ `% A/ ]+ D/ ^
    pic=dir([dirpath,'*.',extname]);6 c0 p# M4 g# i- U  D
    filename=str2mat(pic.name); %取得文件名
    ; r3 J( k( V$ O. s
    ; n& u, D# I( Q/ W, C%调用函数
      m" g# {: r* s! x9 [1 i/ ~$ y9 gsortfile=LengthSortStr(filename)7 X: Z4 ?4 `" G7 b1 O+ H
    复制代码
    7 }  w3 x$ P! ^2 m
    3 I5 e4 [9 x. D' i( B
    ( u5 @! p1 ^% f. D4 v
    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-7-23 17:29 , Processed in 1.210361 second(s), 62 queries .

    回顶部