- 在线时间
- 1084 小时
- 最后登录
- 2015-9-10
- 注册时间
- 2014-4-18
- 听众数
- 162
- 收听数
- 1
- 能力
- 10 分
- 体力
- 43980 点
- 威望
- 6 点
- 阅读权限
- 255
- 积分
- 15251
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 3471
- 主题
- 2620
- 精华
- 1
- 分享
- 0
- 好友
- 513
升级   0% TA的每日心情 | 开心 2015-3-12 15:35 |
|---|
签到天数: 207 天 [LV.7]常住居民III
 群组: 第六届国赛赛前冲刺培 群组: 国赛讨论 群组: 2014美赛讨论 群组: 2014研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
* h3 X% h) x! X. F5 d7 N手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
1 p" p$ U% o' M0 Y3 G% I: n$ c1.jpg, G; ?0 i+ \/ W I- R x
10.jpg
- A2 } F( P7 j$ a0 e100.jpg
) a* C: a" `0 H+ H% \2 b101.jpg
* Y- |) p2 i( q8 N就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
) a2 o) m* c' O, z7 `# p
# V. A9 \/ a; [" f" ]2 x! S- A当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
" a: [" l. q3 ]/ s# X$ _+ G当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。( J2 m3 O( c; P7 l% T/ k
如果不是上面两种情况的话,本文就是实现从小到大排序。
+ D% [' E# a4 w8 x" m9 p, w: ?7 j0 k7 z. j8 C
0 E9 B& d6 ]/ ], [提示1:文件名的获取
* x, L# n" y P& g+ z: p( Z3 E通过dir可以得到目录下的文件名,比如:& \/ Q1 E% k* J4 u. {& Q- w
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
$ u4 X5 e2 d" _; Y9 Yfilename=str2mat(jpgfile.name); ) Q# C1 k& y7 S$ |* I) G8 a
8 m3 ~9 s5 _2 A提示2:字符串数组
0 w6 a* b# q% v" q先试一下:
; _ Q/ O- c1 Q" ] _7 p9 [str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
1 e2 @6 R1 h! h% Cstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
: a( t) P/ [0 A, h; Astr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
' Q( `" B+ R0 ?5 \# p" J7 r( F( ?$ s) s) W1 `# n9 a9 K
这样就导致上面得到的filename每行的长度都相同。7 c" o% ^& U7 _
. @9 Q8 \- [+ K6 z) z" Y: [ }* ^
本文原理:# ]8 x& Z" J- I- W D% [0 X
先判断每行最后面有多少个空格,
e( p3 W6 @* B: {$ L$ F然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
- N$ m8 T) Z( ^( f5 j. U这样排序就可以实现上述的文件名排序功能。
8 [& D$ ~6 m7 C9 Y2 [% a% Y4 C: r
( d; H: X/ d( b4 N" \* ?8 e: F' C& U3 x0 N# }# ]
本文代码:( ?+ n4 `' o8 P- |7 R) B( t
function varargout=LengthSortStr(str)
- P0 \7 l, o0 _! I1 Q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 M1 `- g( ?+ u5 M, t%Argment: str文件名组成的字符串数组
) L" {! w1 f7 l$ _% : 输出参数同sort函数
2 H0 p" E- ~4 M8 B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ F q, Z- ~% V: b4 m3 [2 b; Qch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
0 B* I" q9 Q' e0 T' Y; @
# i0 z7 e6 `4 [) J/ n K- Q[N,MAXLEN]=size(str); %个数以及每行的长度$ w% M& G3 n$ T& p/ l
newname=[''];
5 x, T8 ~5 c$ t" v) r7 M2 i* m
5 F3 G! v! j# g# `for i=1:N/ g( e/ \# _5 Z( r5 c8 q
BlackSpace=0;
" x5 g% d& O [3 j* K while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格3 ]7 X: h7 B7 N# }
BlackSpace=BlackSpace+1;
( h! _6 T3 x3 W) _ end# [1 _9 L2 N; w. V" [" L
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格3 S3 e3 o. J Q5 y$ ?" ^
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
8 @ P2 ]2 \2 Oend% }+ U; b6 N: X" ^6 y: H% K
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
( E& d5 W( s" x3 e! W/ a+ qsortstr=str(order, ; %由这个序号生成原始的排序名- Q% L' y8 f" J1 }+ d) M
6 Z& `% p( M% ~6 X v$ F- J
if nargout<=1* H h# @8 E1 M0 C7 f- E7 I. S
varargout{1}=sortstr;6 g1 k' @7 X j2 x/ W h
elseif nargout==2& s2 [# k) [: m) R! ?& b9 b
varargout{1}=sortstr;0 N. q2 V) L' D) }2 g& ~5 K. F
varargout{2}=order;: G. R0 E9 D5 Q4 [9 W
end
4 f1 f! J( Z9 [# |9 {0 W) r) w( r复制代码
( R# h0 z5 V, t/ _4 S9 i实例:
7 I; d; j4 v& k1 `# z9 h, V. c+ m5 F%对D盘下面的bmp图的文件名进行排序; ^7 a+ H% Z& |9 @ N9 O
clear- X1 @' s) b4 i5 R2 L7 t9 B4 I
dirpath='d:\'; %路径) k6 \ p( d; C' G
extname='bmp'; %扩展名
$ D% ^! ~3 T R4 D/ @/ \# s3 _% ?- ?$ L+ Y
if dirpath(end)~='\' %如果路径后面没有加\,添加3 D' g+ _/ }3 R8 Q$ N% c$ h" F
dirpath=[dirpath,'\'];; L) ^6 @5 I) @% ]
end
; a+ T0 e8 g4 C* G& X
+ x" r8 x) y& j%先取出目录下的文件信息" T) b6 [. v! w# p
pic=dir([dirpath,'*.',extname]);; J/ N7 j. |$ b( R' ~
filename=str2mat(pic.name); %取得文件名2 Y s/ H! y( @: G$ g0 G5 c$ y
: s1 ^% a, X" \* m/ N l9 H%调用函数 V$ @6 j- Z, ^' |+ |
sortfile=LengthSortStr(filename)
4 W |4 Z' B- G+ x7 E* E3 D! E7 X) Z复制代码" O9 h1 @. S8 K( R
5 i9 d# }, N! B8 g0 N. p
6 ^) _; \( K, W t8 c$ M/ F/ ]
|
zan
|