QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3204|回复: 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- }- P) k" r
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    " U, k' n! `8 S% ^8 n+ J6 i1.jpg
    ) F/ R( B5 w& z& i( F10.jpg' N9 s; h! r6 V$ _
    100.jpg
    ; K* D1 t9 a) z101.jpg( d$ d' j; S  f, y( ~7 ]1 L. S
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。& l! I' R, v( ^1 ^( g% z( d- }
    & D* f- w! u: o+ V, ^
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。, b3 w1 [" R. [, j) F' ~
    当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# ?7 y7 a) E) i; J+ ?
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    & a+ z; C  @) E2 `* [7 X: U2 v4 S3 D( m$ l& v' \7 n+ O+ ~
    : s0 }8 @  m! C, v) T  ~! s3 j7 E
    提示1:文件名的获取7 p$ L) |: K( Y) Q( i9 J/ D7 Y8 X
    通过dir可以得到目录下的文件名,比如:
    " s" W- f. Q0 F: j& Sjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    2 X1 E/ u  _. wfilename=str2mat(jpgfile.name);  : L8 O+ U' C  h* M* o3 A9 l

    9 q) e) [) S- h$ q8 b提示2:字符串数组
    * j! [9 l( R# ?3 ~先试一下:& F( K/ C" v- P1 x
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    7 h+ o/ N0 u/ B" gstr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同: l$ o' y0 m% x% X$ w+ T( `& b
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。/ L( g* {. r) q& x2 j5 m* _

      t% g) U. ]2 v4 j2 O, G这样就导致上面得到的filename每行的长度都相同。- o, I- N; I/ @* j- b  K
    0 X" h) v3 f0 A
    ' y( S  O! h9 c& S' t0 w  v
    本文原理:
    4 v  m# q9 G( ~- r先判断每行最后面有多少个空格,
    1 H# X8 W; B+ K! U) E  k然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串! i/ q) J' A% X9 a- e
    这样排序就可以实现上述的文件名排序功能。9 P2 t7 r; y0 i, J$ ~! r
    % c7 o' [+ B1 G" ~' I
    5 D& k3 b$ |( \0 W; c9 p
    本文代码:
    ( Z( G& Y% b0 h% O! s: dfunction varargout=LengthSortStr(str)
    5 G% N- I- j* F, K  L. K%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    . u: R6 a% X7 M8 B9 u$ i5 l%Argment:                str文件名组成的字符串数组
    3 I: u) {2 s9 I9 n1 V%        :                输出参数同sort函数
    & i  Y0 X5 X8 d- \7 w%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: P1 \- @/ k3 v4 a* z  \
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好- K9 F' D6 @) x
    ( F" e. q; ]5 Q8 l7 q0 E$ A2 C4 R
    [N,MAXLEN]=size(str);        %个数以及每行的长度+ P0 N7 X4 R( p3 \. W, ?
    newname=[''];4 W: @% Q/ S8 Q7 N6 k
    5 t( u& T- e1 k: Y+ O# P+ Z& v' S
    for i=1:N+ _- o; U7 _% j- v9 K2 I
            BlackSpace=0;
    " ?; M/ ~! c) v! l        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    & L9 C' M3 E* }# B$ l                BlackSpace=BlackSpace+1;' V; M  m6 p$ d% f5 [" z: ]: z
            end
    * H+ a' X% H4 z. ?! F* \) ~                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格$ a9 Q2 _3 q2 s: n0 ^7 W8 t
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    1 O2 N' G2 }! O  U& ?end% E9 R+ G$ @7 `6 c- x0 `
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号/ F" N' e2 D7 `: K- N/ h
    sortstr=str(order,;                                %由这个序号生成原始的排序名! J8 m1 Z; j- F- q1 D

    / R4 t, ]& \9 U1 t4 ?if nargout<=1  }2 Q2 B5 g2 a6 z* {: [) X% K6 H7 r
            varargout{1}=sortstr;
    7 ]0 |3 D4 I6 L2 N4 O# x8 eelseif nargout==2
    # ~$ m3 i: w. C% e        varargout{1}=sortstr;
    ) u# E/ Q9 j# V4 L        varargout{2}=order;
    8 T! m% l& h* oend
    2 B! D, E2 |/ p4 j复制代码' V% L: u/ }/ F' W
    实例:' O' R& i" h2 y1 \4 _3 N
    %对D盘下面的bmp图的文件名进行排序
    : f7 z3 N* Q% `/ o1 }clear0 p- m& P2 Z7 Z" `+ J7 ?3 Y) F3 L; y) d
    dirpath='d:\';                %路径
    % c& y, l9 U; oextname='bmp';                %扩展名9 p' g* y2 X5 b; ~- H; H7 _
    6 O3 c9 C" W- g' N- |
    if dirpath(end)~='\'                %如果路径后面没有加\,添加+ E- i& P9 w9 Y+ k( L7 ]3 l
            dirpath=[dirpath,'\'];
    2 [1 j; M. v) I- `2 tend1 j/ Y4 Q7 g- @! a" S5 R- l6 [
    1 S6 m$ q% P! p
    %先取出目录下的文件信息8 s* f* d4 ^' e2 q, n
    pic=dir([dirpath,'*.',extname]);# `* w# b8 J' i, W: d0 ]
    filename=str2mat(pic.name); %取得文件名5 z% X; E/ b' y

    7 |2 u! ^; e- @& Q% E) I( ~%调用函数
    : x' _( W! @9 @0 Ysortfile=LengthSortStr(filename)1 d; y+ Z6 ?: }+ c! e
    复制代码5 X! g1 H  Z% T* o5 c2 W

    % J9 B5 T5 B- y
    : G1 T" W8 O) B% 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-9-27 20:35 , Processed in 1.463220 second(s), 62 queries .

    回顶部