QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3161|回复: 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
    由来:
    3 j, Y3 t$ n* L手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    6 J2 {) f- }/ l4 h1.jpg- C' O% U! c# r3 E: R
    10.jpg1 S2 |' f+ O1 e0 C! v9 ~0 T
    100.jpg5 P) A# w' k) _$ T. i9 U3 o# A
    101.jpg
    4 V, P. U* c2 u7 n) i就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。% F' @# s  H, n3 t" X
    , q7 _" [7 S+ r
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    % A$ Q: \) _- c当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。2 l( W9 ~3 l% R  k7 I
    如果不是上面两种情况的话,本文就是实现从小到大排序。( U6 Z: B+ Q# W% Z

    # q8 g) C8 P! N0 o3 b4 T6 r% a( b
    & [) O9 L' s& I0 G提示1:文件名的获取
    - Q4 q$ ?3 ^2 _7 D& h6 _$ n通过dir可以得到目录下的文件名,比如:
    ; I4 C+ v& m( P" O  ?2 H4 m' rjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。2 Y5 v, \3 {% t1 S5 L$ v0 p9 x9 W
    filename=str2mat(jpgfile.name);  
    8 Y4 N$ w, z) A+ `
    7 p) }4 n" J+ x) t3 u  i提示2:字符串数组) C3 w0 y1 H5 y7 B
    先试一下:1 r( P0 |; s9 h9 h: o
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同/ C: p8 I( |- F
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同: N1 d& f) r) {: b! Z9 W8 x
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。' L* |( @# @7 y% G& q4 g* K7 K

    * m$ h4 ?5 O9 W这样就导致上面得到的filename每行的长度都相同。  ^* u' l( ^- ^1 E, _

    5 P: H, B( h/ L  P  O; @  R) I/ I2 w8 |
    本文原理:+ R3 i, ~/ x. I
    先判断每行最后面有多少个空格,
    0 |) o9 l: A* o0 H& N3 l然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    : k7 z# P- X" T这样排序就可以实现上述的文件名排序功能。' o  Q; W( r: l4 D+ P

    6 `$ |( h' }& }7 U# N( ^- [$ c8 o. d4 P- O# V% `
    本文代码:& m% K! _+ Z# ^
    function varargout=LengthSortStr(str)
    9 [- r: M) `& B8 z3 Z, ?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    - L! T& F* _! j! P%Argment:                str文件名组成的字符串数组" b: s5 L( s4 I% s1 v% y$ s; i
    %        :                输出参数同sort函数8 N, Q5 A0 q7 S3 \# X/ G
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) u( {5 \  t  J2 o
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    5 x7 W& v/ y6 W% p7 P. _
    7 k+ B' B& D/ c7 Y9 F. P0 w/ l[N,MAXLEN]=size(str);        %个数以及每行的长度
    + Y2 L& r4 R$ P: Znewname=[''];
    % H& m/ p9 C0 f2 z  f. x6 p) T9 U( {' y' z6 a7 @
    for i=1:N9 ~. V. T/ I2 p# R# S/ V
            BlackSpace=0;
    ) P# K% D) U4 X' y7 R        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    2 C7 }% d2 Z& ^" j/ j# s+ A5 c                BlackSpace=BlackSpace+1;7 m8 a* ~( n3 B5 G; e( C. ]
            end# ?0 s% r$ p0 B6 `9 v5 s
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格% x! o( f  X+ [" ~  B% R
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    8 c6 b3 w2 S9 `, ]2 J- gend6 B; ?3 r4 h- G/ b, N! U3 z
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号% b2 W; J& a! ?% p! s$ z3 S9 F
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    6 v4 d7 f! o% P& K* @: M! a% p3 @0 j; B- _; X0 [
    if nargout<=1* c# P+ G$ v4 q% b9 L0 J  k/ ~7 s
            varargout{1}=sortstr;
    ( b' J# E0 y; d! |( Belseif nargout==2
    2 R5 ]# U, J- l" I' H& f        varargout{1}=sortstr;
    , i. W, M) w2 ]+ A$ K  n9 X+ T1 Q+ y        varargout{2}=order;+ L2 F+ k, A9 |
    end0 E, N, n2 C: W
    复制代码
    ) h' Q' y/ j' x9 @2 z; j5 Q实例:3 n4 J6 r( M* f
    %对D盘下面的bmp图的文件名进行排序5 o: v- n# h) X& o7 o
    clear
    " G, L; u! d$ Sdirpath='d:\';                %路径& G! L$ j2 B! }! W4 v# W
    extname='bmp';                %扩展名
    - Z* d7 \* b! j+ r. p) b1 E( M- f7 l' X2 K2 D
    if dirpath(end)~='\'                %如果路径后面没有加\,添加6 E- R: I( ^* ~# V+ K
            dirpath=[dirpath,'\'];$ K/ x+ d0 |" [/ [  R9 @
    end+ [- t8 @3 c0 ^, S1 e

    & k2 K0 Q4 z" A0 q. i4 k* g% s' g  a%先取出目录下的文件信息6 m: I! |4 ~: n! e7 d  j+ m
    pic=dir([dirpath,'*.',extname]);
    / o+ Q! {0 P; E5 T, Q: x4 Jfilename=str2mat(pic.name); %取得文件名+ T& c/ @( R8 B
    - @) p. j9 U$ \& Y1 w$ m6 u# t% s1 N
    %调用函数
    , I" {9 o, p" A$ @sortfile=LengthSortStr(filename)/ d- V) @: ~' w, n& W4 i2 r
    复制代码
    ( T- y8 X" l7 D7 H1 y/ u& W" e1 q$ j7 J

    " T. A# R) f7 T* S- 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-8-1 16:31 , Processed in 0.309458 second(s), 62 queries .

    回顶部