QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3087|回复: 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
    由来:& a% ^7 N! T- m: l/ F; g
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    ' n3 Q0 ^4 ~& T2 {" C  T* B' {1.jpg# ]; ~7 d& K( t. G) c
    10.jpg2 k; g0 M( s$ g, q
    100.jpg
    - @/ q1 [; m* h; _8 D1 G6 A' H101.jpg7 k* ]6 s' \2 Z# Q. R9 i, W* U
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    4 j# }+ E/ q1 M% e0 Z: ]# t- l8 h1 ^# |
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    ; r4 n% ^# k: M; a1 a/ X当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。) I) ^0 e: g2 Q5 t
    如果不是上面两种情况的话,本文就是实现从小到大排序。2 m( _4 b5 @3 q5 |& v4 v/ A

    ! G- i* w( g5 |) K& B
    ) J- E2 c6 `5 b" ]& H5 U提示1:文件名的获取7 l# R+ T' J) }
    通过dir可以得到目录下的文件名,比如:
    * w( x: Y; h3 P5 yjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    2 o1 k) n& t3 n8 m& E$ h4 vfilename=str2mat(jpgfile.name);  2 T) Z7 q4 i! C3 p& o3 F

    . |9 p, l# B6 X提示2:字符串数组, ]( N* V. v( f: `5 S% L8 B. G
    先试一下:
    + c5 N+ m& l9 r% \- q# Rstr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    % o' }( J+ i4 w, r" W' ]$ ~str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    , x) p* B# r& J: Rstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。$ j6 H4 H4 E& {- w% W; k0 `

    * F, C9 K8 S* Z2 E. @" D/ c; z这样就导致上面得到的filename每行的长度都相同。
    9 S* h* w! [- ~7 m& P, K' `" n
    ! }$ J7 V- m6 J, |: i  _  v2 c  t
    5 T( }! W  l8 E( A* r本文原理:2 R% j2 q0 T# e' d
    先判断每行最后面有多少个空格,+ \2 E2 r# r$ \* g, N
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    " P, _" @) y/ }/ K+ C4 F7 Q$ n0 {这样排序就可以实现上述的文件名排序功能。3 z$ S0 s/ s$ j

    - S+ u$ c8 B# F3 u* }" h
    6 x- \# o, L0 t5 M! y0 Z本文代码:
    & A, T0 T8 X( Ufunction varargout=LengthSortStr(str)
    5 M' P  l0 o3 e3 {8 k% f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    / r- h. ]& e, R1 u# G% J%Argment:                str文件名组成的字符串数组
    ) k8 A$ N1 D1 {. l! n# J8 [%        :                输出参数同sort函数  t1 s# A% Q- C: M& u" t
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    $ D. t5 ]+ b$ k% G/ {3 ]9 e4 wch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    8 b1 q+ b8 t) \5 W4 w7 ~$ Z
    , Y/ q' R6 ^/ ]! h/ E[N,MAXLEN]=size(str);        %个数以及每行的长度
    $ ^! `4 ~7 v+ W' c$ {1 {) |" Cnewname=[''];' Y/ i* v+ I4 ?, B1 {" [! M1 U
    ; @$ V1 m8 F% x# ^2 l7 _, K; S
    for i=1:N
    2 ^" f  r) r# }        BlackSpace=0;/ g  f5 z* g& _3 p
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    ) g: ?1 O) l9 I# v* b+ U                BlackSpace=BlackSpace+1;; t7 {/ w) G8 i
            end
    0 y- _% ~) v; T7 x0 Z) h                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格5 I3 d& l, G  \' Y
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    : M2 n7 I  _& g- o( D- Q5 `end3 C$ g+ n' }  H# ]+ {
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号
    5 d% L! B  z* C, y$ A1 Ksortstr=str(order,;                                %由这个序号生成原始的排序名8 D& E- o& I, ]! U6 D# K5 @: Q

    ( l: O6 G6 O" z( P2 Y0 q6 L5 Cif nargout<=1
    ! ~2 C  R; z, q: P& g, y        varargout{1}=sortstr;
    ; o8 v2 m( Q( Y- M% x3 b& F; Belseif nargout==2- W/ k$ v+ g* j3 C
            varargout{1}=sortstr;$ c+ S1 {' w& ^
            varargout{2}=order;
    ! u8 o3 ~1 {* iend
    2 \+ H% i) V  x复制代码
    " a% k4 C# s$ Z' Z% i6 K实例:/ R! k+ o- h! ~( S
    %对D盘下面的bmp图的文件名进行排序
    - p& l, G1 O5 rclear7 I; H" t6 P# L0 \# K$ [! W1 d
    dirpath='d:\';                %路径8 y, A6 j! ]* I. G( o/ u
    extname='bmp';                %扩展名9 B/ o4 G- p& \& H0 O4 N- R, m

    # o! N6 Q0 p& T, h1 t0 f3 Qif dirpath(end)~='\'                %如果路径后面没有加\,添加# i' h& f- L3 ~. S* S, z
            dirpath=[dirpath,'\'];& {3 L% K! S4 ?$ y+ [
    end
    - S& E% }2 {4 P) }, m; N# Z6 ~+ p) p. t% W2 Q; H
    %先取出目录下的文件信息& `0 O# s+ }# o! r6 Q# `9 i
    pic=dir([dirpath,'*.',extname]);! n% E0 B9 O0 Q& m, K. g5 R  o: Y
    filename=str2mat(pic.name); %取得文件名0 `* l/ c1 Q' j' ~

    + q. J9 Y4 t9 |9 P8 E- P. q, s2 q: u%调用函数
    - t, n. b" S2 v8 c% z# Y: ?/ Ksortfile=LengthSortStr(filename)
    ( y, d7 M8 r" Z  `2 E9 o8 s复制代码: B( l9 X  q! t# D- A- B* R
    : h; `7 b; o- l$ I4 l9 |

    & F' i3 n  ^2 G
    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-17 07:10 , Processed in 0.430938 second(s), 62 queries .

    回顶部