QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3086|回复: 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
    由来:1 W" _! q) I  L0 ~! D
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    # N" f. F" B+ A8 x" H$ A9 v. r1.jpg) r5 c9 \* k) {( I- |6 m* f$ `
    10.jpg' ^( n0 h* V% b* |  b) j
    100.jpg
    " R* B$ l. H5 S& k+ }101.jpg$ l5 ?  j, J( c; H: I
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。: C: |  Z9 h8 z& b
    ) u. h4 J; J4 q: S* V& r6 B
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。( x& ^# _0 _0 K8 C5 S$ A
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。, f: v# s. ]+ F% {. L- k
    如果不是上面两种情况的话,本文就是实现从小到大排序。! w0 Q0 i/ @0 }/ e( b8 a4 W- \+ W
    ( d8 p" W2 F$ `) ?- E: y

    0 ?$ D! ~# _" F6 W提示1:文件名的获取
    . k/ x8 t' q' V8 z通过dir可以得到目录下的文件名,比如:
    $ \: ?: R3 ~/ R+ Hjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    : ?0 W! g0 P% t" Qfilename=str2mat(jpgfile.name);  1 Y5 ]) ]3 i$ ~, o/ f- [+ i3 ]

    " c( q4 _. @& N2 g9 L; `& w提示2:字符串数组, S7 i! M6 h; T, v$ F
    先试一下:
    : H% e3 n7 R2 t- {str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    " f6 j0 J. M  W/ V# s- g- {4 k# F2 D) Z1 Wstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同. R+ l- ?3 a" V  D
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。! r+ E7 `) |  K+ M1 f( |
    : n! F2 S2 P6 Y2 x( k; u
    这样就导致上面得到的filename每行的长度都相同。
    / f$ ~& L5 ~8 q" h, z& X) D8 l  X6 N) z; f6 U% |

    3 ^& J/ E3 {, Z) n本文原理:
    $ u! Q1 I3 T5 @: M/ L' I% d9 U先判断每行最后面有多少个空格,
    9 D& N8 l0 @4 v% `% S# `( S然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    4 D) `4 z: u5 k! P2 J# q这样排序就可以实现上述的文件名排序功能。1 h  D$ B; f' I7 W% h" k
    " \/ I, K' j4 W2 V  Q
    3 S! n2 f7 q$ ^- L+ r
    本文代码:
    : |; g4 |* P: X) J" ~; o# bfunction varargout=LengthSortStr(str), J& H, [6 t' ^7 V
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    , M0 H, J# R; p( e+ B6 v- y' i7 X%Argment:                str文件名组成的字符串数组5 o/ p) }6 M6 r7 L! `
    %        :                输出参数同sort函数
    : w. }3 w/ m3 O" G! `%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 v; J( H' c- Z; q8 k7 @
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    ! V, ]: i1 Z0 n. f: L  _; a- E6 Y9 q6 T
    [N,MAXLEN]=size(str);        %个数以及每行的长度
    7 V1 M' S% m: ~2 ^1 Mnewname=[''];* e! X5 B+ j4 u: l0 n
    3 _* E, z$ w  @% h
    for i=1:N$ z  C% T( ^/ J. k0 M* `
            BlackSpace=0;8 m3 A' K% r) D$ F8 }3 ]
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格  P# E: @, F* O2 Z; Q! r3 \
                    BlackSpace=BlackSpace+1;
    / @, ?) \: x- s        end
    # B; u+ L& C0 j- C, f  o                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格' X# \  S" T1 S
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    - _7 c( u! s( Gend
    ! p- ^$ R! \5 B5 J[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号5 s' a, a2 P3 t4 l4 {6 ~: N) Q
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    0 `9 s8 o& X+ P2 a# [
    8 p( T- O8 R- ~+ {  o7 o5 Q* b+ u. Xif nargout<=1" x3 @! Y) s; [+ ^% w
            varargout{1}=sortstr;. o, b2 K' I+ m& R" u
    elseif nargout==28 p6 Z! K! V' f4 t* p1 @
            varargout{1}=sortstr;/ O" E/ ]; Y8 W# D" I3 c  {8 h. u
            varargout{2}=order;* c: _4 B; ~! ~+ O
    end8 v5 R$ I) _$ s) K9 Z
    复制代码
    % {$ o* ~+ u+ T' O; @, f1 t实例:* {6 c8 o! K5 e) C! P
    %对D盘下面的bmp图的文件名进行排序6 k& h) v. L* [/ K% n6 [) E
    clear
    - @8 U. W- w6 idirpath='d:\';                %路径
    ) H9 G. t: @9 Z( Q6 |; Dextname='bmp';                %扩展名6 p6 ]" t: f( }% q% _
    9 _3 P5 n/ G! u( Y. a0 U9 z$ j
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
      F9 ~3 C5 @( R  x/ x5 g        dirpath=[dirpath,'\'];
    % G4 I+ ?& N# U0 Q9 b" q6 }end) K& N, f0 z, C& b, R' S

    - o% k: c: z5 }7 s# M%先取出目录下的文件信息: g% o0 W- R0 S/ }! [  @+ {
    pic=dir([dirpath,'*.',extname]);% u4 E! |* K" k( }( V
    filename=str2mat(pic.name); %取得文件名6 {4 I, _# b8 g, [( m
    / f' t, \/ |, F, X1 ^
    %调用函数
    $ o4 h/ T7 d) Q( [+ Qsortfile=LengthSortStr(filename)0 D8 g5 W: n2 c; G# |: r& X
    复制代码& ?; E4 u3 x! o& q) b
    4 t9 _2 C* `& y1 C  L) o$ x
    ( Y" H1 W, {# E9 f. w  n
    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-16 19:25 , Processed in 0.423307 second(s), 61 queries .

    回顶部