由来:7 g) g# I. C3 j
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是 * S7 n2 q% h h+ d& d o/ l5 \1.jpg! [/ G1 L' z6 W
10.jpg7 s) z* m; v6 j( u
100.jpg0 o. H1 D# @* a @ j. O0 G) i8 F
101.jpg 6 }9 b2 B! g7 x就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。; u& R2 O0 O, @" }, i
% B. h! t( ?: j& u
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。" i4 k+ A% L- r) N4 Z
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。 ' M2 b( o/ j1 i/ [0 m如果不是上面两种情况的话,本文就是实现从小到大排序。 * c' Q2 Y. n+ U# J9 [' ]$ g% f; t ) Z+ I5 @9 H9 U7 Y3 y ' X7 v7 {' {- ^0 z6 y- V1 d3 N提示1:文件名的获取 ! W5 f! }7 _. n8 d3 q& ?. X' j通过dir可以得到目录下的文件名,比如: # H2 H, {; U! X0 U5 T3 \jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。% r' {; ]1 h& t- B& W7 g( F5 }9 _+ W
filename=str2mat(jpgfile.name); ! a6 d: r: {4 ]% u2 K f+ j! }6 e6 m% I! d# J0 Y
提示2:字符串数组" d: L) e$ m$ f, ?. k3 F0 k( r0 o) N, l
先试一下:) Q8 w+ ?$ a4 r/ s+ o7 x
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同: y' \5 w7 G$ b: R) }. E
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同 % O& [+ T+ V( L5 Z% P. I- Mstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。% R2 U& h1 a8 |8 f
) j' y/ q7 F! o" a y这样就导致上面得到的filename每行的长度都相同。 % Q2 W8 s& {" ^# i* y - ?6 p y9 X" S5 `; K( y# b7 D5 ^5 A
本文原理:8 Q. A @6 ^7 X
先判断每行最后面有多少个空格, 0 \( H# y7 ?4 W, X" f- X: E0 O, m" \然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串 9 _# t8 F: q' w j这样排序就可以实现上述的文件名排序功能。2 R1 U" x; M& [9 o ]: o4 O8 p" t
, E7 y0 p1 O( ?' ^4 W8 v- Z, `# c! a. @- v8 K7 o% Y
本文代码:8 {& |% Q9 w' x6 q! [, e
function varargout=LengthSortStr(str) % @4 N; s, \ h8 u1 y+ \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! `! t2 l- o+ }- H; j' m3 x%Argment: str文件名组成的字符串数组# W5 i+ q, z9 C( y* w$ h( F* k. Q
% : 输出参数同sort函数1 o) p; E- c! k1 l0 w: Q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" p, g7 h* B+ T5 s9 W- J; n
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好 : l8 f, w) h7 Q7 [ % M, f$ B8 T$ O[N,MAXLEN]=size(str); %个数以及每行的长度 9 I& H3 b* l, G' S( vnewname=[''];9 c& a. P4 _5 w1 I( p' C) r& G
0 ~5 I0 `7 k* afor i=1:N' O* C8 h, n4 Q3 h% o
BlackSpace=0; , Q2 Y$ r1 w6 Q2 \2 O" Y while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格! z9 G$ i; n; V- q2 W1 u
BlackSpace=BlackSpace+1;8 }5 A0 A( m2 u. P* k' i# {
end # Q+ L1 c9 j7 N4 K z0 C" e %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格 ! G G" z# c# ?: d newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];4 ^1 z! i* o0 s$ N! q d
end9 m! O/ o! `' ?& ^5 s1 i
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号) d7 K! P: D1 v- ~2 f' x5 r) A
sortstr=str(order,; %由这个序号生成原始的排序名 ! F# @9 l" H: w4 X3 x- I. t8 m& B+ s: _7 N8 o
if nargout<=1/ G& ]4 z7 U/ Q: a" g1 O2 O
varargout{1}=sortstr;3 v! ]9 z8 ^# g9 f
elseif nargout==2 % I4 Y5 @2 B( J( M$ |# _ varargout{1}=sortstr; / K- b# i3 B/ t" g; \ varargout{2}=order; + H. ?$ s! ]4 |/ m7 hend% o% z# Y/ Y4 ]
复制代码 & F4 d- j" y" F, p实例:8 D; u0 h: N! Y) I# T4 H
%对D盘下面的bmp图的文件名进行排序5 B3 h- \# a1 I6 n: @
clear9 ^6 ], z9 d9 k
dirpath='d:\'; %路径 - L! V* \/ y, R! T# s) H. ^6 fextname='bmp'; %扩展名+ j( L! x' U2 T% M; z
# \- J9 ]/ J4 |8 Q L( q
if dirpath(end)~='\' %如果路径后面没有加\,添加 4 U& r& @9 i4 N u' \2 A0 F dirpath=[dirpath,'\']; ' k, c5 S7 ]8 E( y* p% w- Kend: Q6 M, K. ]( A$ y0 R+ {4 E7 \
5 h- K' A1 d9 S. b( I, V ]' o%先取出目录下的文件信息0 R$ o4 V* y# \/ L2 [+ k8 l
pic=dir([dirpath,'*.',extname]); & V& @8 ?+ G% L \( @filename=str2mat(pic.name); %取得文件名0 [) s) ?- u! z3 C f" T
# r0 p. ~9 ~3 B* A$ E6 n/ f4 Y%调用函数% R2 U- i! n1 O) p
sortfile=LengthSortStr(filename) ) z; G$ ^+ H) G9 S2 m复制代码 0 h$ c K7 d7 _% f5 k) k0 l. }! Y. X9 s F- Q