QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3133|回复: 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
    由来:
    , I0 i3 ~; B" O$ R9 u- @0 Y7 m" R手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是& a+ k- ?/ L5 Y+ p3 l  A" L+ N
    1.jpg
    9 }0 R8 r6 s0 j  P10.jpg
    3 D1 B& ~# _& Y1 H+ l100.jpg
    " {( b5 E0 X5 e9 C; s101.jpg
    ! ]4 r; Y) t& Z! v: R2 l; z# i就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。# h  ~% J6 E1 B& p* K, n; }; c; e
    , }  _2 @, j2 s7 e5 R' f; Z6 P7 r
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
    $ y; v% }; c* ?当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。& n3 w# b2 O, I$ B, k" B
    如果不是上面两种情况的话,本文就是实现从小到大排序。
    ' k1 v* }; w9 j+ b
    3 U* t0 |; t% n) Q$ c
    % k* O. W7 v2 e( d" B5 F) N, \; ^3 R提示1:文件名的获取
    ' C7 U/ c2 C4 Y$ `/ v通过dir可以得到目录下的文件名,比如:7 a6 {; a- U  _6 L1 v) T4 I
    jpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    # C$ {  }& W3 X3 Pfilename=str2mat(jpgfile.name);  
    ( }+ ^0 }& g# ^/ D0 X  ^& l
    , s+ E9 S. T0 U提示2:字符串数组  O0 ?* [  {  Z% [
    先试一下:: `+ x" x8 y0 M: `3 s) }7 U1 V
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同9 Y1 y  K9 R8 e4 ~0 y/ \
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同0 k% u5 j; T8 |( g  i
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。0 _8 X2 b; w. D$ w4 v

    : Z7 t2 K. X- ?这样就导致上面得到的filename每行的长度都相同。
    0 E' w5 y3 U; p- |. S. Y/ \  _! t* P. h% v4 m) N5 k

    2 w5 ^) o; B9 L. j# C$ o( q本文原理:" i7 z  j( X) R
    先判断每行最后面有多少个空格,: s+ `0 n% R& X) J' J5 z  y% D
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串9 A8 D* \/ z  r- m
    这样排序就可以实现上述的文件名排序功能。* E7 m9 J$ ?7 o& b& }. V3 T2 T
    / f# u0 D! s# r# J* c

    6 [0 h2 ^4 P. I本文代码:
    / X* H* M2 t! H: T  z0 zfunction varargout=LengthSortStr(str)
    + o5 {& h8 a. ?/ Q& t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 V0 d1 B* D- ]6 G% X# R2 |
    %Argment:                str文件名组成的字符串数组1 q' |( M( Y9 [& [1 |. O
    %        :                输出参数同sort函数% W' E4 U: R  Q8 e; h( p7 z
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. _' t* e; }  a! d1 y
    ch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
      B6 z9 S8 u- n- @& S, E$ P' |+ i* T+ p! v, v0 E/ @8 N3 L
    [N,MAXLEN]=size(str);        %个数以及每行的长度3 C# v. k" {) Z7 }0 ]* e2 t. I
    newname=[''];0 t* @2 U- p6 U4 z, i. {- j" U

    & O5 J% }3 g; q; I" xfor i=1:N, |+ T3 g# x0 v8 j7 Y
            BlackSpace=0;2 m" \. j! f6 y  V( V) S
            while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    5 O1 A# c/ ~; ~5 G+ C                BlackSpace=BlackSpace+1;
    * U: y2 Z8 M6 Y' E& Y        end8 G- Q3 E, O, _# p+ l. H1 t
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格: q+ j% f( _8 q; F$ A
            newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
    : o- p2 h4 x5 o9 B& ?% |9 L* n  B/ {7 Cend
    & Q1 V5 M6 Z9 b' B4 p$ I[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号+ Y: j1 X+ ^4 B  t0 Q( D. F9 w; X0 r
    sortstr=str(order,;                                %由这个序号生成原始的排序名) Y( E% v0 }/ G- M
    7 M, h" E3 h" k" D% M
    if nargout<=1
    5 a1 ^0 k* z( g! q1 p        varargout{1}=sortstr;, _0 Z0 R% |% y& V% M
    elseif nargout==2
    ( N7 C2 C% `: i$ V, s        varargout{1}=sortstr;
      ~3 ]4 N3 s  e& `  R& q        varargout{2}=order;
    6 y7 f( p- ^- ]: W$ Aend
    - [7 B8 o# U# X复制代码+ g8 n4 W$ i3 b7 P' j
    实例:( L9 C. F: E- T8 M  N! a; Y
    %对D盘下面的bmp图的文件名进行排序
    * S5 C% x" J4 b2 D1 @+ ^+ iclear# J1 C" v# r% [7 T* Y
    dirpath='d:\';                %路径' x( Y, J4 d5 x" s& k+ w" o
    extname='bmp';                %扩展名
    ) V! @8 \' S+ r! d+ c
    2 k  T9 f$ n" Nif dirpath(end)~='\'                %如果路径后面没有加\,添加( C4 D; j7 q( ]
            dirpath=[dirpath,'\'];
    5 ^$ N+ t. _* G1 N6 vend. E' \; L2 o! d+ d2 m

    4 G! a# M# K- q/ x/ d1 O; Q%先取出目录下的文件信息
    $ X' f! O; H- q* b: epic=dir([dirpath,'*.',extname]);
    / ^: U: Z5 L7 K8 mfilename=str2mat(pic.name); %取得文件名6 J/ x& u% F" V4 n* O
      R: T$ g7 J) i- t9 C& _) y
    %调用函数
    % d7 `4 d6 I; D2 E8 z4 [7 a' rsortfile=LengthSortStr(filename)5 t3 m1 ^8 t6 p' }) g' ]
    复制代码
    0 B! @6 j6 [8 T$ f3 G1 I: d6 Z, q8 u4 {" j6 l: P( j
    ( _9 @. n( f4 R8 l: \, D
    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-6-12 02:12 , Processed in 0.307601 second(s), 62 queries .

    回顶部