QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3141|回复: 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
    由来:. M. S0 _+ E0 k0 a( B
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    5 x# k: w. S6 z% w" Q; j1.jpg
      E: ^; u( r, ?' q, v7 E10.jpg5 ]; D$ w5 g0 R* c& U3 |# k6 @7 E
    100.jpg5 N$ ]7 K1 S( K; d+ \5 u
    101.jpg7 I% c/ T+ y) R$ K, t
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。0 t: F2 v4 t  ]3 p+ a# F$ w" g- A. Z
    - p2 t/ K( h, j+ s6 n  D
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    0 p) p8 E5 ?  I- }$ U* c1 }, ^当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。/ `* |, I9 Y) S; s* P/ A
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    5 _% Z) e' d. g* K# N0 K# l+ v3 _; O+ z5 K; w9 u" `
    ! _( u! O' M+ e* V
    提示1:文件名的获取
    ' D3 ?* u# U+ i2 b+ e4 E通过dir可以得到目录下的文件名,比如:) Q+ k5 {9 _/ G5 t: l
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。7 r: o- Q: \1 x& f3 m0 ~: j
    filename=str2mat(jpgfile.name);  9 Y% F' a$ i$ C$ ^

    / _% v2 t+ a3 k2 ]" U提示2:字符串数组
    1 R; C1 s( ?# h* }: g先试一下:
      X8 p5 r, |% ?5 E8 ]# `str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    ) j0 O* S8 D) r: A, ~  [2 u7 Cstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同. k5 K3 H) H. m. }! F
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    ) P1 f/ A0 o2 K% y/ F: q9 h7 J9 j9 V" \. T
    这样就导致上面得到的filename每行的长度都相同。
    6 e) P" o, |$ I( ?: o" k( K/ k( M5 ^2 X, P) Q; w' Q3 z: e
    . N" h6 C; H* @) y' l7 k. r2 g
    本文原理:% e) K; y' E# Z( o0 {3 x
    先判断每行最后面有多少个空格,
    6 c9 v0 b. I# i$ G$ h0 v然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串, u; s/ n: ?2 @, i% N
    这样排序就可以实现上述的文件名排序功能。
    1 H9 G5 }; s. J8 ^5 y; M& ?  T- a  T9 z4 k8 l, V4 j" K

    9 Z; i+ u" F) N本文代码:. v, j4 @% v0 m0 t* G0 t* i
    function varargout=LengthSortStr(str)+ X2 m4 e3 y! z6 G9 E8 o8 }
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    - L: t0 u% ]+ ?% ~8 q) v%Argment:                str文件名组成的字符串数组6 q' }6 @/ e' O% q! ^- {( b2 |8 D, }
    %        :                输出参数同sort函数4 F5 r  `& r8 @  U+ @& m
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% O! Z; M& {" @! y* G  ]
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    5 ]4 I: g( Z5 y; W% w0 o1 B# Y
    6 K, X$ ]" Y' |3 Q[N,MAXLEN]=size(str);        %个数以及每行的长度4 X7 E" S; M: _& l) g% j1 S6 I% L
    newname=[''];
    , Y6 y$ \& R& [  g5 z8 t9 c! Z* B4 W  z0 }6 n
    for i=1:N! M8 f/ M# ~& O0 G8 d+ o
            BlackSpace=0;
    3 l, r9 B/ u2 m  s        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    . Q6 U$ O' i* @" s                BlackSpace=BlackSpace+1;
    * `$ N7 Q; E! _4 H4 h! k) A        end
    0 V5 H2 h& u/ G8 A: g7 b7 a                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格# Q' W$ \- M9 t, ~$ R+ U
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    " e  W. q$ R+ O2 |1 w" f+ B+ rend% ^3 y/ S; Z" t: T0 {
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号. c, |8 u# Q) c$ A3 f# y& j
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    0 A' Z1 y1 l, N. @/ k- a8 }- G. f4 C: c) d
    if nargout<=1
    $ a, @* g+ Z* a# t" q8 y        varargout{1}=sortstr;2 c# n- ]; L% E
    elseif nargout==2
    0 m, }, J/ S1 p# T, u        varargout{1}=sortstr;3 `+ c5 G/ S/ P! a9 X$ z6 C
            varargout{2}=order;8 c3 w) Q( e7 `7 X
    end
    # ]3 _9 f* z) A  t- y复制代码
    - Q" f3 G$ L+ F8 N实例:% B/ Y! |) k# C: s: n* j
    %对D盘下面的bmp图的文件名进行排序* A: X  r' a+ b$ }% i. y& s
    clear
    3 N7 n- c8 o" mdirpath='d:\';                %路径; v/ V/ w. P9 B9 R$ s9 ]- o
    extname='bmp';                %扩展名
    $ {2 z7 ?( ~7 H& C- l. j9 }" h  }, y9 g4 q0 i/ S1 U+ T
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    ( g! x& P. Y& m. d0 h        dirpath=[dirpath,'\'];) n9 {, S- o+ M( s
    end& z0 H( |; _3 ^0 n) A

    5 K+ Y2 G: b1 r- q+ \( ~%先取出目录下的文件信息% t5 A) k* N, i' {/ T) A5 b2 V. _+ p
    pic=dir([dirpath,'*.',extname]);+ J  l* p, e" `6 W: a
    filename=str2mat(pic.name); %取得文件名, ^1 M; O% j" N" ]$ {9 ~
    2 r& _) w, u5 t' L1 r& @) ^
    %调用函数" I" i& z9 }; Q! m
    sortfile=LengthSortStr(filename)& ]7 J9 G/ g* c& c
    复制代码& c4 u- s$ z1 D8 P

    / `! f) a7 @  D; ^, U( n; R0 ]8 y, R- W1 v: E" {
    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-6-14 21:56 , Processed in 0.430284 second(s), 62 queries .

    回顶部