QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3206|回复: 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
    由来:! _1 d2 _, s) h  _" r2 Z9 m
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是! W) M. c0 |" P3 \3 }
    1.jpg; E2 }2 X- x0 ]
    10.jpg
    ! D0 |8 s! m- J& @100.jpg
    * U7 b" I% m, P, a101.jpg
    : o' w/ E( O3 Z# e7 i就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。7 A. {5 a9 F; i1 l2 Z$ W1 ^8 P
    ) e! s) v$ H+ m6 W( j# I
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    ; H+ j4 |5 ?0 o6 H5 W当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    8 a  E/ Z1 T, I9 [; V5 d5 W% H如果不是上面两种情况的话,本文就是实现从小到大排序。
    ( h7 G8 t; o& {' h
    - d0 [3 `, }/ `: M- I' f) f+ J# Y. ~* J3 M4 Y* U7 l- F" @
    提示1:文件名的获取' O! a4 Q# n  E' ?& o9 I* G: [! B
    通过dir可以得到目录下的文件名,比如:0 k7 X- j0 f' Q4 |" k0 n  g
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。! A' v$ Z. B6 w8 j
    filename=str2mat(jpgfile.name);  6 j5 d4 n" w# `- ^! n3 C. Y% j+ Y

    0 e2 N2 T; K! \1 K4 W) e5 |' m) D提示2:字符串数组9 [. R' e# A3 {0 m3 ~
    先试一下:
    ' D( s* o- _% h  H  I/ }8 c/ U( Ustr1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同# {7 \  M3 J9 V0 ?8 K" |' y, J( o
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同
    + c8 p: V- s$ x: ~( r1 Zstr3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。- b) _" ~6 r- p+ n
    4 L2 s1 a0 ~5 L- L
    这样就导致上面得到的filename每行的长度都相同。' Q& p! a& Z; C0 `  {

    ; R- x9 h1 ?6 o- k  t1 S: S4 O! E- V) S5 b  F
    本文原理:
    7 j# z) v3 R  n1 Y6 l先判断每行最后面有多少个空格,* g$ b& Q$ n  y- X- l. o" G# D
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串! L2 k1 U7 z; p* W7 S2 j$ q
    这样排序就可以实现上述的文件名排序功能。( r- R$ E- R: P! M4 A# O

    + W( s3 H; I# ?$ T( h
    4 ~+ y8 K5 S  t* W& ^+ v& I本文代码:
    * [* H( P; J" Hfunction varargout=LengthSortStr(str)- p0 d7 Y: Y: _8 ]
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ' }1 z/ g1 K/ [* a8 m4 Q" c$ W2 v%Argment:                str文件名组成的字符串数组" @# n2 g- N% ?. @7 |% R2 A8 h, ~
    %        :                输出参数同sort函数
    ! K0 L: f& N& c; t" c8 L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ( i. w$ J, b8 i  t4 X( m  zch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    . K4 A' c2 J5 _, M2 m- x$ w9 n8 h) i7 ^7 e0 d! }
    [N,MAXLEN]=size(str);        %个数以及每行的长度1 ~8 A% L, _1 }+ I
    newname=[''];. J3 {( [0 o: z6 {

    9 ~  X) g0 |# T1 S$ ifor i=1:N
    ! {8 \$ i8 z2 J: \" W- E$ m5 ^        BlackSpace=0;* y, }% H( {: t5 S
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    , \1 g) J$ V# F                BlackSpace=BlackSpace+1;( M7 ^  w- V7 \" z; i
            end
    % f, P- h, ?5 ~% e. ]  p- G                %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格6 S+ T* L! b8 _0 Q- i0 Z
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    1 g8 H9 ?7 W4 y) X! ]: ^5 s  Z4 P  Dend
    9 B3 E. g/ j' O' h+ P[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号) q! b- v* m% b! t2 _( V! Q
    sortstr=str(order,;                                %由这个序号生成原始的排序名
    - }% P2 Q* H: |# e- c, y( T* K6 O3 q2 A# z
    if nargout<=1
    9 s6 G% t' b7 l        varargout{1}=sortstr;
    5 N0 B# [4 P" i' o+ L+ q2 l; G: @elseif nargout==27 E$ _2 V; |8 Q( J; z. K
            varargout{1}=sortstr;
    5 V. L, H' {: b" ~! }: W0 T9 t        varargout{2}=order;
    ( k* \  F2 w3 r* q, b" aend. }/ L, Y. B  G; t% C
    复制代码2 C$ D' S* D/ K
    实例:
    - P4 {4 Q' }3 e+ \%对D盘下面的bmp图的文件名进行排序0 r) R4 O( |  a- v1 [7 u+ p/ k5 x
    clear
    ' N2 \) V. P8 K: b# ^& g/ k" Fdirpath='d:\';                %路径
    # O  q# ?, n% ^" Bextname='bmp';                %扩展名- x' C+ ~* g. I; N; k& T
    ( s' U9 ]. s  S( v# v
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    * e" G" b! f( e$ {) c+ }        dirpath=[dirpath,'\'];! M$ z# f, ]; a: H9 C
    end
    3 L9 M1 X7 F" P7 G. U& c
    + Q/ j/ E. m! {/ h% p1 p%先取出目录下的文件信息
    ; v; A0 n' F% c5 V* G1 ^* Npic=dir([dirpath,'*.',extname]);
    & s# k) K+ e3 s8 g7 rfilename=str2mat(pic.name); %取得文件名
    ( a5 W3 A% F1 c1 m7 G) r6 I; O, H9 o4 g) u5 W
    %调用函数
    ) o& j$ N5 S( F! n2 jsortfile=LengthSortStr(filename)
    ! d, c- S4 A9 ~- E3 ]& g复制代码0 w, d0 ~5 k6 l4 ]0 n

    $ ~# U# x. P( W) J  ^
    / @) I( g) Y2 C0 c
    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 21:01 , Processed in 0.294956 second(s), 61 queries .

    回顶部