QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3160|回复: 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
    由来:3 H+ L! x3 _3 d" L$ u) N/ C
    手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是3 P" y6 [! L! C# j3 x% U; {
    1.jpg0 ^9 N" @1 m. g2 ]% k" m6 \- j& d
    10.jpg, k5 _9 H# a  E& D
    100.jpg
    - T0 r; x) V$ L7 F101.jpg
    ; M0 D; G' W# F  Z就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
    / I  r9 |% s6 t4 o9 c7 ?* W8 M9 A  Q; |* R: B( Y- Y: w
    当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
      N% g5 g3 [( e  D当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
    + h8 O5 v1 z" m, X9 ]: c如果不是上面两种情况的话,本文就是实现从小到大排序。% F% j7 q7 Y) ?4 l; Q  V& }

    + s4 m; F* Q, t6 V0 `5 ~3 p9 {) E
    * j# B  S7 v1 z* E提示1:文件名的获取! Y  U3 }. F* F- z5 S" m: x' b5 I9 \% r
    通过dir可以得到目录下的文件名,比如:
    4 I( S5 w# {% O1 hjpgfile=dir('*.jpg');  %可以得到本目录下所有jpg文件的相关信息。
    " }- x/ `5 w& lfilename=str2mat(jpgfile.name);  6 K" Y1 S! q5 T3 o1 F
    ' j! U( F" g1 `: t5 h& ~
    提示2:字符串数组# K% @% W- B7 K
    先试一下:6 _# N( _! ?/ O/ y8 |1 ]( [4 D
    str1=['mat';'lab';'sky']         %这句没有问题,因为每个字符串长度相同& T  [+ [5 r8 G! R) E2 h
    str2=['matlab';'sky';'love']  %这句会出问题,因为每个字符串长度不同, `# x# q: [' p/ `% k* [
    str3=strvcat('matlab','sky','love')  %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
    " @$ q& r% U* c: j- z
    6 i& Z  S& V6 p, m这样就导致上面得到的filename每行的长度都相同。
    & c- o7 j/ [2 l- A3 D- a) c
    & u7 C) l: R8 _% a
    ' Z, Q9 c7 c: H6 x: @/ r! h3 b本文原理:
    ! K! K: n" u+ H6 C! }先判断每行最后面有多少个空格," K6 K# G( x: m4 s
    然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
    , h0 c8 H! B' O& e3 j- c' t5 R+ b; N: k这样排序就可以实现上述的文件名排序功能。
    3 M9 K: n" ~- _; W
    # W' x8 s) [, ?, G% T# l% j3 {9 w8 j" \; `: m
    本文代码:! m6 r& Z# ?8 ]" K3 g/ N
    function varargout=LengthSortStr(str)/ v2 v  V. V7 _& y
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 k9 ^" g, r$ T& [
    %Argment:                str文件名组成的字符串数组
    : M* Y3 p! a- {( s( v& \! V4 ]7 b%        :                输出参数同sort函数
    $ t% B/ @# u2 O4 ^0 J0 e- W%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % V& s& J- F9 p% }$ K8 e3 s  H7 Xch_ascii=1;                                %用ascii码相应的字符放在文件名前,这个值越小越好
    + P; H9 E- T$ ?. g- `
    ( X/ A/ r- t  |/ c# D[N,MAXLEN]=size(str);        %个数以及每行的长度
    - ^; Y' m6 Z# \% q& m0 h" X; }0 p+ unewname=[''];
    * x, U( Q9 y( I/ @% Q) z; w! |( ]0 W$ n; c) K, w- x: @4 \+ @9 N6 B
    for i=1:N
    , x5 s; g; g, f- ?1 d9 `        BlackSpace=0;
    ) [3 _+ i5 K9 Y  k3 q, x0 s8 _% C        while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
    * z2 p0 @( W5 }+ h, C                BlackSpace=BlackSpace+1;9 S3 T, h6 p, J# d7 h# `; S( D, J/ X
            end1 v1 h$ o( D' I
                    %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
    * X* z5 r" q& }8 @( b        newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];/ x5 h- ^- L. ]  U
    end
    & S) `$ ]% G* S  j  d3 F- P[sortstr,order]=sortrows(newstr);          %新字符排序,主要要得到排序的序号0 o! G# ?+ z! b2 G" {  H% Z
    sortstr=str(order,;                                %由这个序号生成原始的排序名! ~4 p2 |4 c2 m6 G3 S
    ( n! {+ Y3 d: L" Y' D
    if nargout<=1
    ( v" n# H- L3 c& M0 I2 x" E8 f        varargout{1}=sortstr;; s4 T/ e! z7 o* E( g
    elseif nargout==2
    3 t) g8 b( p( \3 [( e        varargout{1}=sortstr;
    * P% L( I9 k9 G6 _+ R/ }        varargout{2}=order;
    9 q1 p) n8 N6 q) ^4 U5 tend
    9 o: F& I( Z% {! H* \复制代码
    ) E) ]/ z/ U( i# s: ]" o3 t实例:
    " E7 r6 j4 ?: L%对D盘下面的bmp图的文件名进行排序8 ]0 T7 z- J/ O9 _) f- U
    clear! u0 {0 S& o# H3 t: p4 f. v6 h! G
    dirpath='d:\';                %路径% ?; J: n. b2 t+ N
    extname='bmp';                %扩展名( b' C. v/ x" p
    $ u. V' }! A7 l- d+ g2 [" G0 P
    if dirpath(end)~='\'                %如果路径后面没有加\,添加
    ( Q) N& {4 Q+ u        dirpath=[dirpath,'\'];
    * y; Y3 Q3 k7 \. K2 bend' g5 t$ ?, Y5 y. }
    * E$ R3 U' i$ M, U1 N. z
    %先取出目录下的文件信息
    " w* U; V  l8 R& D+ opic=dir([dirpath,'*.',extname]);
    + ^$ c8 E: _. P4 i! g* Pfilename=str2mat(pic.name); %取得文件名
      P  f0 D9 e, N3 D; K$ f$ {! M, V6 V( |: N; S6 @! b( t" I
    %调用函数" h. m! i* r, W& e3 l" V
    sortfile=LengthSortStr(filename)
    # l5 R2 D, [9 t复制代码* \. I/ F8 D4 i9 I; ^; U

    , w8 r0 H  `% g" J* T8 R
    & f/ A. u( g7 I7 A: \
    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-7-31 04:21 , Processed in 0.481237 second(s), 62 queries .

    回顶部