QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3044|回复: 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
    由来:& ?+ o5 ]& a8 `: Z- I
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    % l$ R) [' n: v& v1.jpg3 r" N! Y2 q2 Z2 Q: l
    10.jpg& j. h9 _: \* v6 n
    100.jpg
    8 A3 G3 N. Q4 S4 ?/ W  o101.jpg1 I/ w) `! |3 j2 q6 E
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    3 l$ W' E$ K3 I- x9 m8 H6 ?: h1 ?9 u+ e) c- G3 ]. J. D
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    5 p& E% V* _' e( `* {1 u9 J; \6 ~当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。1 ^2 P5 N" s5 F7 O- D% v8 l
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    - M* _+ C- F$ g8 ~- z
    * `% w' m% i, T, _
    9 ?2 m1 `0 e/ ?# h" t+ H8 v2 g提示1:文件名的获取
    3 q, H: P+ W# I7 Q. ]8 U( V* \, l; v通过dir可以得到目录下的文件名,比如:7 X% F$ {3 ?. m
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    - Z& e: F# c3 a5 e' ufilename=str2mat(jpgfile.name);  : c, f) _! `8 Z

    7 L- g$ B* N( e9 O& t, l/ @提示2:字符串数组
    $ Y1 E5 D( ]0 k% [先试一下:2 [5 b- q/ I6 r! }9 d6 G
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    . u0 ]3 ^, y6 O9 |5 ]# q$ `+ Gstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同2 \# J' F  L9 K6 f. e6 u4 T
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。8 H1 A( P. W: n8 |

    1 t% q. J: K- ^# a( ^' J6 c9 @这样就导致上面得到的filename每行的长度都相同。
    7 g. D* g8 |. J5 i# e4 M! F$ }* R
    6 E# w* N* S- F; q& Y; f
    * d8 s6 a2 X9 ?8 W本文原理:$ d% [7 V6 j- C' v$ y
    先判断每行最后面有多少个空格,. @( W& a" s7 p5 u8 L
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串# s  C- Q1 b8 X  R; E6 d
    这样排序就可以实现上述的文件名排序功能。4 A& d7 ]6 x3 E) z

    , z9 l3 h2 q4 M% }& P) s' d4 p( Q" ~6 f0 H8 m
    本文代码:
      T5 Y) t, ]& dfunction varargout=LengthSortStr(str)  f% O, E0 f! {9 q3 h9 o, Y) d7 l; W
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ) ^4 m$ \% O8 Q: K- c, I& }9 T# r%Argment:                str文件名组成的字符串数组
    ( S% A8 R( g* H%        :                输出参数同sort函数
    : N* F1 l1 y, p$ W3 |+ z% u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ' v1 d* d3 n( v/ \* Sch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    * S; @9 Y+ ?% N% [# M4 X. ~4 c. z& G9 [2 b" @  p% @
    [N,MAXLEN]=size(str);        %个数以及每行的长度
    . V& U3 m4 n5 knewname=[''];
    5 y4 Y9 v8 @( _
      w/ ^4 e& c# c0 X/ ]' ]  Gfor i=1:N
    " S) e. ~5 ]' N; g% _$ o9 g6 u- ?        BlackSpace=0;
    8 L8 u  Z- x; D% M9 N7 d1 b# d        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    5 S3 P: q3 M: |* J+ o! Q                BlackSpace=BlackSpace+1;8 T1 O) B( G5 }5 X7 I4 W
            end
    9 ?  o( }+ |7 q2 C( w8 {/ q- c0 i                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    : Q8 f* M, ^  M. b9 M5 Y8 C( d4 u5 D        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];+ W  n. T6 ~( v! \; [) o3 y$ q
    end" d0 V$ ^4 o/ [' h" o; }3 z$ t
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号" O% @3 g& x6 j' P9 \" x6 @
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    3 E' }; w% Q$ D9 \. z1 _, i* y, C: j1 ]( x  H2 K* X0 n) T; Z
    if nargout<=1  M$ o0 A/ Q; k4 W1 r
            varargout{1}=sortstr;
    ; G6 Q( p1 ?) l% E0 R# {elseif nargout==2* Z. ]! c) |2 E. I; ~* V' m1 F
            varargout{1}=sortstr;
    + v+ G$ }% L9 p* O+ W  H: v$ c! k        varargout{2}=order;. {/ y/ R& F& a# k4 K) H% h
    end1 l! @- _9 x* y. `$ x2 ^$ Q. F- i
    复制代码0 e$ M, f, V' ~8 k2 K! E5 F' [
    实例:
    5 Z7 y* w+ q. @) d8 p7 U%对D盘下面的bmp图的文件名进行排序- O% N- n* T3 S. g+ H& U& |
    clear
    & ?1 |; S* ]  p1 P9 f4 S1 ^. G8 Ydirpath='d:\';                %路径* n  d8 S) f* R4 t
    extname='bmp';                %扩展名
    # z  h* r! ~( l' c6 U, j, @! m; \3 X* ~  f& i2 s
    if dirpath(end)~='\'                %如果路径后面没有加\,添加+ r( _0 d% g7 k
            dirpath=[dirpath,'\'];
    * m- |6 q2 s- f( O( iend) a. Y' @1 g9 D9 @
    7 c8 N8 w0 @2 ?8 o
    %先取出目录下的文件信息1 i+ j# n' m" Z. E; o
    pic=dir([dirpath,'*.',extname]);. E+ W1 \# v) X/ Y' e+ Z* U
    filename=str2mat(pic.name); %取得文件名: C" e4 E4 o0 f* C* F) t" k- Q

    7 l! C- S% {8 Q* M$ h%调用函数% A0 h, r- n: R% G: U8 P1 R
    sortfile=LengthSortStr(filename)
      @8 s0 K% @+ `4 Y6 O" x复制代码
    / M# b' i" C. l: S
    7 C  h# s" E8 _( `& c, x5 t4 }6 o1 m  p! T
    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, 2025-12-25 11:30 , Processed in 2.001698 second(s), 67 queries .

    回顶部