QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3135|回复: 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
    由来:
    * U" r: g* p! F手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
    . N% z% {' F" `9 |- {. S1.jpg: t& A6 J6 F: F( T
    10.jpg
    7 p5 C2 n$ y) }5 u$ G1 U$ Q/ X1 L" C( v100.jpg8 E- F$ \4 \) {
    101.jpg% p* v& ~% s5 {/ g- i; x6 J
    就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    9 L& m$ {/ j+ c0 o
    % I2 }6 L0 t  E4 ]. @( q5 ?当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    2 j3 \2 J% x: l6 N2 o' V8 N当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# w7 H' A, Y0 b$ N5 ?, i6 j# u" E2 o
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    2 \- I/ f: R* O+ e( F+ |/ O2 y# U" s  D- m$ U( a# L! Q

    2 E( B! g5 p; L2 X, Q" ^提示1:文件名的获取
    9 g3 p6 x, ^/ E/ u. z通过dir可以得到目录下的文件名,比如:+ i# _6 z& U! I
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    ) I, H1 _! D( y1 e( Efilename=str2mat(jpgfile.name);  $ Y' n/ \1 s* s: {; C
    : `3 I+ H+ Q" {# q- N% e( y" n( Z5 ]
    提示2:字符串数组
    0 C1 O4 ]& _; w& \先试一下:
    ; g( x  Y) p" L8 t; @str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同
    0 j% D7 W: I8 X9 Istr2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同8 V) p0 j; d5 T5 R( ]9 w) X
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    ' C: n" n$ i4 i' X' E
    1 L* K6 [% B- T; W& N3 w这样就导致上面得到的filename每行的长度都相同。2 d6 e% L& c* i% L
    # D3 I, |# f" q8 g3 g- F

    + m; @: V0 a! k: C本文原理:6 s* H% V. e, f9 C9 S
    先判断每行最后面有多少个空格,0 y0 G2 X/ X" @) Z7 ?
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串( V7 C8 K5 G& ]! m! s4 U9 ?: @' e
    这样排序就可以实现上述的文件名排序功能。
    0 _* R6 S: |* q) }4 G' Y5 e- H) k* g0 Q

    $ B0 j4 b# G: u+ v本文代码:
    / k. N: j- H& ?, W0 Wfunction varargout=LengthSortStr(str)
    5 z) p) I& E  P- \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    5 l( ~2 A3 T" g5 d  \%Argment:                str文件名组成的字符串数组
    5 E! J  F- E& `1 N%        :                输出参数同sort函数1 B$ M5 o+ ?: R
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2 p, D6 K& v- b4 X) k0 o" Pch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    % f  O* V, S  I$ c8 s9 H3 j  @( x
    ' r5 W! A$ ?- ^4 m' K3 I[N,MAXLEN]=size(str);        %个数以及每行的长度# O/ h2 Q. _& ~
    newname=[''];9 X5 L4 K4 A1 s3 W1 k8 S. n, [

    % e: V# Q; V4 Y# ifor i=1:N
    ) y! d0 Q0 B( |+ f, ?        BlackSpace=0;* J  J0 A2 K6 d+ I
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格& Z/ \' ^+ m+ l" ~2 y* ~6 n
                    BlackSpace=BlackSpace+1;
    7 P! o1 M# A- h% ~! i' `: i7 ?+ Y        end
    % ?/ M1 Y# ?% P' [/ G                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    & D2 N4 M, l# n# D7 q! H        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    $ F3 F& ~, r, ~2 P6 Tend  l/ v5 S6 G+ B, Y2 I( ~2 ~1 x6 H$ }
    [sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号* {4 ~2 p$ I8 x5 s3 V4 T8 {
    sortstr=str(order,;                                %由这个序号生成原始的排序名1 U3 O* y" J: @
    9 v8 ~9 a" t' a, i& a
    if nargout<=1
    5 b& A" y1 F  R1 T% n  Y2 n! l, h2 q        varargout{1}=sortstr;/ d: r) ]6 ~7 [4 W
    elseif nargout==2
    * {1 S9 r3 ~6 M# v; m        varargout{1}=sortstr;4 s% G4 {. x6 O' a
            varargout{2}=order;6 N: t) M3 T# ?9 D) C; q7 A& w) j
    end
    ; z, h' {9 v, F复制代码( l. }- g1 ^8 N' H2 B* P% F9 n4 e; ]8 M9 e( e
    实例:
    1 t) A8 V3 k9 [+ a. r  o9 c6 ?%对D盘下面的bmp图的文件名进行排序% a9 c! O7 `1 C' l# P  I
    clear
    5 K! v% I8 H! z1 t  t/ a6 q% `7 s4 ?dirpath='d:\';                %路径
      w3 \  o- o& n  \) x0 S" `extname='bmp';                %扩展名+ Y# j$ w8 i4 k' E
    & _" @. t  A- V" P; Y; {
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    ! n6 [) L$ N% `0 q9 K, h1 F        dirpath=[dirpath,'\'];: N9 P( m+ s  E4 |7 Q9 P/ E
    end
    , \$ {4 w: k, x1 d3 e# O, n( [2 }0 P& S
      n6 D7 l* C: d6 s- p' R8 C; o5 b%先取出目录下的文件信息
    / t( {) H& U  L& Bpic=dir([dirpath,'*.',extname]);  m! @: d4 L. z4 D) C
    filename=str2mat(pic.name); %取得文件名/ q+ @/ B2 h& n  G% r: n

    4 x0 c9 `( e) G  R1 k- \- |+ b%调用函数: N2 P$ w# c0 w% B+ O
    sortfile=LengthSortStr(filename)( h& u" `1 T/ R
    复制代码
    + t8 B, a  @3 b0 i8 J4 ]/ r, D" g( n. ]! ?- m. j% i" V
    " Y, ~& j4 H" b# ~
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    12

    听众

    43

    积分

    升级  40%

  • TA的每日心情
    慵懒
    2015-9-7 19:24
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    回复

    使用道具 举报

    冻鱼        

    3

    主题

    12

    听众

    147

    积分

    升级  23.5%

  • TA的每日心情
    开心
    2015-2-12 00:09
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    邮箱绑定达人 社区QQ达人

    群组全国大学生数学建模竞

    群组哈尔滨工业大学建模团

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-12 20:44 , Processed in 0.347688 second(s), 62 queries .

    回顶部