QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2824|回复: 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
    由来:
    ) P+ D+ ^9 q! z8 f! h5 G% z" |手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是' v" }0 S. v. U
    1.jpg8 ~7 i4 F8 Y7 n3 }/ P
    10.jpg
    ) Q0 ~( k2 b! l' Z! R100.jpg
    - ?( c6 j; E* g8 d101.jpg
    7 Q9 Y4 v3 V( c4 L* U) I就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。- ]7 i/ G: _0 L' z6 y; D

    8 y, w# T5 K' v  j, J; e6 V当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。1 J; u( w4 C! ?
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    4 o, T" ?9 M: E% M. l如果不是上面两种情况的话,本文就是实现从小到大排序。
    ' }6 ^$ C' w% k' @# _  H- B, E! a& G& z! L" m
    ; ~5 [- i6 Y! h8 z+ i
    提示1:文件名的获取& g& V1 B% ?4 _! K; |
    通过dir可以得到目录下的文件名,比如:
    3 y" Z. R5 N4 \4 u4 }9 s7 A  ^& Kjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    + o/ `% n5 U/ wfilename=str2mat(jpgfile.name);  7 t5 p( O6 s' Y3 m, [

    " r; `  O0 v. @1 P提示2:字符串数组6 s$ `' c) O) m2 N7 z" u
    先试一下:
    5 s! H" D' y( [' Istr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    , }+ E3 M7 I+ G2 x5 L0 Qstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    & U2 {6 q2 `7 M4 y7 Z- E% @8 l9 @$ Rstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。8 |* t4 n0 o% Q& `# i6 b. B+ u
    1 [% J* J+ [$ I
    这样就导致上面得到的filename每行的长度都相同。
    + l* q; K: p4 B$ _) |- F( F/ G) a( g; q
    # G1 W+ U1 B6 p0 X
    本文原理:
    % y( |: H: b- t1 ~4 _: y5 u先判断每行最后面有多少个空格,8 q- E  m1 r3 W4 n8 i+ Z7 {
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串% ?2 C+ r5 r5 _$ N
    这样排序就可以实现上述的文件名排序功能。
    3 {8 {/ q$ a) Z# G
      _: F% |" [4 {$ Q* X# F, j, C( E; Y6 s" j' J0 k
    本文代码:6 ^: a- N/ Q. m! S( R
    function varargout=LengthSortStr(str). v2 M8 y: S. A0 ?. H2 Y+ F3 h8 o
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ! j0 T% b$ x& t7 R6 L: x%Argment:                str文件名组成的字符串数组
    ; `: x3 v% K& A" d3 t4 U%        :                输出参数同sort函数# e. e3 p8 {& e9 F3 X3 i2 N
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& l. ?, o9 G8 O! e. D6 f% _2 a
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好8 \7 s4 h) c$ g  q9 {5 R7 g$ S9 O

    ' ?$ t4 R* n! D: _- y[N,MAXLEN]=size(str);        %个数以及每行的长度
    ) q( p+ n' y% \newname=[''];2 s$ v- K, H: M$ c2 b; h2 H* K

    : U4 H2 p. W% a4 u& `for i=1:N
    ; s4 i: O  Y; L' m, b7 A7 ]5 |        BlackSpace=0;  s) U8 E& V0 I3 U. v
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格8 c, X: J; N/ W; R! e
                    BlackSpace=BlackSpace+1;
    * R# L9 ]3 _$ e/ a8 T( S( r        end
    ) Z) `, H' U2 f                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    % X" X, e6 X& y. s% ?/ P. H        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];4 H. s! _- q0 z# r9 i* H9 o  B+ y
    end
    , e/ c5 {1 t0 x! G: N; H[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号1 h: @3 e/ k3 ]" f1 |
    sortstr=str(order,;                                %由这个序号生成原始的排序名: H4 M# H7 y: N2 {$ Q

    6 _/ O1 a; R1 X. R. Q" G8 e8 fif nargout<=1
    9 t8 @$ x" l2 @8 K  F1 k5 S        varargout{1}=sortstr;- H$ `2 [+ h* e, T* M8 W
    elseif nargout==2
    ( L9 T! ^, D! X5 j8 C        varargout{1}=sortstr;6 Z4 X9 \$ A; z) J! u3 ^: c
            varargout{2}=order;
    5 u/ E& p# F  y2 ]" `7 v* jend
    0 y. W# T" L( n复制代码- F! T$ r' T/ T: C
    实例:: V: d! n0 \" m' a
    %对D盘下面的bmp图的文件名进行排序2 s  ^+ k$ p( a; x& Q
    clear
    ; `! y; m- x: H! Y) [dirpath='d:\';                %路径4 f) N3 j% c/ r8 k' w% \
    extname='bmp';                %扩展名
    , L1 t/ n  [$ N9 U  j, x3 p" Z7 {
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    * b  s5 s" l# z$ ^! Q1 V; i        dirpath=[dirpath,'\'];% a6 y+ X+ q- \9 V( C  B
    end+ W: ]/ N# X4 Y5 c
    4 a9 a7 x6 p  k3 `( \7 F6 G
    %先取出目录下的文件信息
      x" u: X5 b0 [$ Zpic=dir([dirpath,'*.',extname]);* m; [/ z& \; Y3 x- X/ \1 X* y/ s# j
    filename=str2mat(pic.name); %取得文件名2 w, `$ D% L# p/ d1 x2 K

    ' l6 {/ \7 F6 n' o3 p%调用函数
    ( y  H0 x! I0 S. D0 dsortfile=LengthSortStr(filename)
    6 W0 P8 [' U, I1 }复制代码' S# O1 l* `6 Y" W
    . r) X3 C4 W, Z1 z+ ?
    7 n( A" D6 N: {8 f) ^6 A( [9 y) 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, 2025-7-28 00:42 , Processed in 0.421562 second(s), 62 queries .

    回顶部