QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3083|回复: 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
    由来:+ A1 \0 G8 G9 V; L
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是# T3 {5 O' K& z% W
    1.jpg- h4 p% e6 M9 Y; Q9 s4 `- e
    10.jpg
    % G, B) b, e0 v0 D4 ~2 P100.jpg
    ; Y# a  u3 A7 ^101.jpg5 _* H) u0 R5 x/ R
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。' r! x, N: S: C, J; |3 l9 p

    * j8 l# H9 `4 \) _8 W  E当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    3 y2 h3 S0 o+ J0 B" o. q当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。! C$ ]& l: |: c2 v- e8 S' `
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    . j( G3 T5 @  ]% Y6 E
    6 R; h6 o2 k' k) A# W- H, W7 Z$ a& \2 W. a& z5 {$ J
    提示1:文件名的获取6 S# v% K' |+ i+ W# z
    通过dir可以得到目录下的文件名,比如:
      a3 U1 V* M! i$ _1 ~: Ajpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。$ `* G3 i$ }% H/ h- B- j
    filename=str2mat(jpgfile.name);  
    0 O8 j0 [0 h7 o5 Z
    7 K1 J8 J! T- O: E% Q; D+ `提示2:字符串数组
    5 c) {- |/ P2 @* N先试一下:! h, H- P, e. j. Z" W! K
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    : ^& H6 u: h- X0 s6 M9 {$ w6 wstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同; d/ l$ l0 J& s6 S: o
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。; Q& x1 ^( F- R# D% B0 i

    : a: Z3 n3 j3 H6 C2 A# M这样就导致上面得到的filename每行的长度都相同。
    ( A8 I+ Q4 d4 T7 H& A: I/ I' `0 e/ Z4 d
    1 T; j' F: p& f4 ?
    本文原理:& V% v$ [! P' G2 U: I# O# r5 l$ x& }
    先判断每行最后面有多少个空格,) K- b/ V/ s0 V7 R7 z# g: s
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串% G9 c/ p  T) @- F: K$ _
    这样排序就可以实现上述的文件名排序功能。8 e  S( |  B! j9 C8 W; y

    1 {0 j& x; }8 j# v' D( P+ V& I  J4 K+ {% y; Y) i5 l2 @1 k' V
    本文代码:' w+ {5 `6 _( m% ]) ?4 q. _0 i
    function varargout=LengthSortStr(str)) z, C7 ~7 j) u' ?9 l- r# j
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ' J+ K) Y. N' T4 T$ |%Argment:                str文件名组成的字符串数组4 O% Z: b( |) M" A+ b
    %        :                输出参数同sort函数
    * D; k3 U: S2 l' v7 R+ K0 r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    . P1 O: d1 z1 S- U  ]- q. S0 n  @ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    ! k6 V( X, t4 K0 p3 Z4 U- ]6 P; y$ r+ ~3 y6 c( p3 C
    [N,MAXLEN]=size(str);        %个数以及每行的长度
    % X6 g$ G! W; z* V2 y  s4 Xnewname=[''];9 `- H2 A& `+ j

    $ W5 `4 G0 n) V5 c8 Y: `( Ofor i=1:N+ q  l  O9 v4 n) h) K0 y/ \( L
            BlackSpace=0;# j! u3 @. L; K6 \  a& `0 H
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格( U$ y" I& F, C; B7 {: M
                    BlackSpace=BlackSpace+1;& A6 D* J, X4 h
            end; {0 N' J! x4 i1 z) Q1 D) }& T
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格# S' v7 S% \1 p# n' _2 l
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    ; Z. t/ T; t8 V5 gend# Z' r) Y% r0 a) }! [
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    . t5 b! u1 A' Isortstr=str(order,;                                %由这个序号生成原始的排序名
    8 A' `; B7 ]4 g! P: J4 y! p9 H5 w5 E, I
    if nargout<=1  F4 F: b6 U' o3 S7 [" h" j* S  ~
            varargout{1}=sortstr;. h" U$ e# S- |7 ?& b8 ]1 g% ]: Y' G
    elseif nargout==2
    8 H; h0 g$ _# {) U" t6 K        varargout{1}=sortstr;
    2 w) k, r+ i! ?        varargout{2}=order;
    0 Q" q! N, Y) P2 ~( Q# Dend
    1 H6 P1 x$ F2 \9 l5 x复制代码1 H; A: @0 n( _# H. O. c
    实例:/ e4 [; ]" X4 y1 ?( T) I
    %对D盘下面的bmp图的文件名进行排序1 Z/ _0 C1 g" d% s9 V7 v) r7 Y
    clear
    3 Q; D; ]9 d3 c" s1 E1 Q- o$ f* s  cdirpath='d:\';                %路径
    # o& k- n9 \. X2 aextname='bmp';                %扩展名! _$ ^  a+ I" @! h4 M% ?
    4 J% e5 \/ C1 L/ }: B' K) u
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    4 @3 i0 q6 M! A" Q/ O$ H1 ^        dirpath=[dirpath,'\'];
    ' B0 K- K- A, \2 iend
    0 U6 {9 i) m6 y, E% O: ~& P
    / ^. A) Y; V. ~1 X% h$ Q%先取出目录下的文件信息) T* F& z% k# l* p, d
    pic=dir([dirpath,'*.',extname]);: F" O* H/ V. J$ x
    filename=str2mat(pic.name); %取得文件名
    8 u! S0 V- ~; l! y& p7 ^0 M& I  q5 b9 V1 C
    %调用函数/ M' a5 x! v' ]: c: a1 U$ m, o
    sortfile=LengthSortStr(filename)
    ( `( E) s  C1 l0 b+ J$ j复制代码7 i2 f7 ~3 o, ]0 `5 C

    $ W5 w/ U; S: F! @9 _" d
    # [4 j9 U$ f. _+ M
    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-4-13 20:19 , Processed in 0.289800 second(s), 62 queries .

    回顶部