QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3082|回复: 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
    由来:
    + V4 A! r  H/ s* K2 S% _+ i手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是# @0 c6 K* p* p% Z
    1.jpg
    9 Y6 `; X# S( i10.jpg5 J* D& j1 o. J2 {6 h6 Y
    100.jpg
    2 T& s" h) |, ]! N101.jpg
    . g& Y7 Y) f- T# M/ G就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。: s5 G1 T" h8 j1 W

    2 s2 u' _+ ]* m1 q9 }当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。7 }, R# i) b0 {0 u* q2 H7 w
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    3 t5 x+ i6 w( H8 W  \如果不是上面两种情况的话,本文就是实现从小到大排序。
    - ^2 L; I- c5 z, }8 C9 A2 W) C6 S0 q1 t* O1 f* y( w

    3 x+ l$ _8 t! }! Q, O9 o  ?: |8 n提示1:文件名的获取( h" G8 @; o* ~! [# K+ L- k
    通过dir可以得到目录下的文件名,比如:
    ' J! }- g# e7 K% Y& i: ~jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。4 |( A9 h- M5 Q5 k* X. m: U2 q
    filename=str2mat(jpgfile.name);  
    ; n  z( K! a# P9 I
    * U$ C; o1 k7 Z" y7 i6 {+ P% m7 ]2 C提示2:字符串数组$ O, ]0 a: X7 d9 E4 R: R
    先试一下:/ t/ P) |! c$ W3 a: @0 }( K
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同5 x6 ?$ s7 @$ U6 T6 d  Z7 W5 ~4 Z
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同2 X; Q8 n7 u5 _/ \" i
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。; W+ W% A" w4 R, ?, c

    % l1 J1 G0 E% {+ J这样就导致上面得到的filename每行的长度都相同。
    6 g8 g; Z4 v" Z
    / A) e* [+ y: [5 ^* q' @: u. l( p$ s; Y
    本文原理:
    1 j, x; O  Z/ b先判断每行最后面有多少个空格,- n4 T  F: R7 \6 A/ O
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串7 q" V0 w. N6 m' H0 J: C
    这样排序就可以实现上述的文件名排序功能。2 W( ^4 \% m; u9 R
    5 m( [# `0 b1 ?/ h5 V( _

    , r& l: n' S' D  h/ {5 Y本文代码:1 [% [% n/ A8 `3 Y1 M
    function varargout=LengthSortStr(str)
    4 P2 j( |- J5 V- ]. W8 ]%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% V  g! v! f( y* ~, |$ u
    %Argment:                str文件名组成的字符串数组( R+ B+ _# x4 J8 r4 w3 M
    %        :                输出参数同sort函数+ q3 z0 K6 B  g" b# |
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    * v: @$ W* O' W- |, D2 C# R' b) Vch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好6 F" S5 j& L& L

    + Z: D( K/ n- _8 M  Y[N,MAXLEN]=size(str);        %个数以及每行的长度1 y! _' d& Y0 }
    newname=[''];1 ]& k) \5 }2 w& O
    " G% n3 [; o5 X$ D
    for i=1:N
    3 q- k1 h2 O6 Z9 w% O        BlackSpace=0;
    5 Y, S7 M4 M* ]; O        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    ! a/ I) A) W) ~                BlackSpace=BlackSpace+1;+ q$ }0 F# ^1 D0 Q9 j5 ~  ~
            end/ b- R  O% R- M1 W% I/ r$ i* W4 S2 `
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    + y0 O, q4 Q5 J# o! ]        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];# B) e9 L8 i- h3 |5 C) s5 d
    end
    + F. D1 o! W- `8 \[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号& d+ C, M' }3 i. v
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    5 O: W0 s* S+ ~* A) W4 P6 N4 T+ `% L) q* I
    if nargout<=1* k4 q5 _5 {  g% k' Z
            varargout{1}=sortstr;2 W8 w: Z( ^3 q9 l, T
    elseif nargout==20 r% G* |# |  R  _) ~
            varargout{1}=sortstr;
    7 V1 y+ a, \. `        varargout{2}=order;
    : }4 y, d/ C$ K/ u9 G3 {end4 Q& b4 H. F" \! @* N
    复制代码; I. j7 l: ~! y3 Q  ?! I
    实例:# A2 N8 i% d$ `* l( J* p
    %对D盘下面的bmp图的文件名进行排序
    / e7 Y, i$ i5 s; \0 Q- x# m2 Iclear0 s% p/ S3 `* G
    dirpath='d:\';                %路径
    $ A" i" q$ `8 rextname='bmp';                %扩展名  p, \( w/ ^7 o" u; i( o
    : c" Z2 s' n9 H+ h0 k3 E/ }  d0 n% u4 a
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    4 o0 y- `9 F, y        dirpath=[dirpath,'\'];6 l  r5 ?6 F+ X, t& Z
    end0 U  I3 }& t1 h4 l" a
    ' m) r: x1 ^& u: z1 V2 D3 y, S3 I: @
    %先取出目录下的文件信息
    * L( |0 ]& f$ |) Y1 Mpic=dir([dirpath,'*.',extname]);( C7 u$ _$ w% d' a" q
    filename=str2mat(pic.name); %取得文件名4 p9 E& [7 i6 s/ w# m  f0 e
    . {/ b8 y& S7 |% r* G* {0 @# e
    %调用函数
    8 t# h" u$ m# a/ ~% I% I/ nsortfile=LengthSortStr(filename)9 T7 G5 h4 c, L6 I( Q, U
    复制代码
    $ a  S1 g2 k1 q  f# }/ S! E3 D' O  r( N$ n; K0 R, S
    9 x" g4 I# S8 w  y# b
    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 17:34 , Processed in 0.411286 second(s), 62 queries .

    回顶部