由来: 2 ]; j1 z6 g: @( L1 @; Y手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是7 T+ H$ `- l2 j
1.jpg " {) d7 h4 `' {4 P% N10.jpg4 D4 T7 e% I; e/ r" _% E2 g
100.jpg7 u. Q8 U& u8 n4 G1 F
101.jpg 4 E! g( f! k/ _3 @, s5 K9 i; J就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。2 O* E, w3 Y, }. N+ A; v1 O" l+ T
# w0 ?( i; S1 G0 v
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。 ! O" P) e0 `7 k+ O! E* ? ~9 p+ N3 q当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。" n: Q, T; W" o% I
如果不是上面两种情况的话,本文就是实现从小到大排序。 z1 Y) p& E. W- j+ A `0 w3 ?% G/ b" h' t) u E- L6 ^# h. z
提示1:文件名的获取% t j3 M" L1 n& F% S' ?& p, R
通过dir可以得到目录下的文件名,比如:# e' E; f O, j+ y1 A7 s0 C
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。 5 L2 ]( _# q+ y+ Afilename=str2mat(jpgfile.name); 5 _6 ?7 {, t& N0 @ 3 M7 H. ^* o5 ?) u2 ]* t0 Y提示2:字符串数组 . ?+ ^" `9 s7 ~- U% q) A% [先试一下: E7 [6 W$ Q4 m2 j1 ]str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同 w4 T1 L y! K
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同 ; U0 W; A1 `. m1 Tstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。 + A7 d& I# O. @/ Q M& Z' m " u6 W7 y6 ~( K$ n0 r7 L这样就导致上面得到的filename每行的长度都相同。 7 D0 E9 `3 c0 `7 @, A2 V; i9 W# _# k
; r7 @( u8 M6 m1 h: z3 J. M本文原理:2 [, Q7 m' y* i% b6 M7 U+ w
先判断每行最后面有多少个空格, ) f* E; M {5 s1 {( k. Q然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串2 }8 S# `0 b$ P' x+ g; |6 F! R
这样排序就可以实现上述的文件名排序功能。 # {0 s& N9 e- |8 F* g* m; F: A4 |0 p, i4 a8 o2 h: X, f
8 L: h; }0 t' F Y, N
本文代码: : ?: ]5 m8 {4 sfunction varargout=LengthSortStr(str) + Y0 p5 m ^8 s+ S, u- P6 P%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% `. C& w) r r! ?5 Q5 s. r! O
%Argment: str文件名组成的字符串数组" s$ x; i$ w% `/ ~7 T3 E+ {
% : 输出参数同sort函数 0 U+ e6 Z' \4 [, S1 ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 b- z. ]2 p* A5 f& r
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好0 } G: D' j1 ?3 f g+ z2 S
7 W; T1 F# }! W' j/ R, H
[N,MAXLEN]=size(str); %个数以及每行的长度3 a0 J4 }0 b1 _6 L- h' `+ ^
newname=['']; * z6 f; M! p9 Y) _; u % t# W# e$ t* bfor i=1:N , a: c/ _2 t( e" c0 c6 @ BlackSpace=0;4 w' h4 K2 \4 }& b, p$ o
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格 5 K" j5 V$ E+ f$ ] BlackSpace=BlackSpace+1;. Q. y8 N6 v" n1 k$ r- A
end . I6 ^+ B0 g" |% B3 v: d) y, L. W, ? %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格 1 g% Y5 l5 `: H6 X% ~, E) \/ Y newstr(i,=[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];1 V+ B2 l T$ D
end # h! q) W0 F, A5 j[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号& s! t' ]2 h$ Q) v
sortstr=str(order,; %由这个序号生成原始的排序名 ' ^1 i3 d l; i * O3 B$ H$ X* n& o' A( dif nargout<=14 C" r& c" d+ J& b) v* r9 M
varargout{1}=sortstr; ; ?' `$ G( S8 N0 L5 \7 Uelseif nargout==2 2 g0 Y5 A5 k2 ?0 e; [' a varargout{1}=sortstr; ! X. V1 i( ?! ~# e% N. Q' a varargout{2}=order; 1 t0 A* ]/ z7 C: c, f% L6 ^: k; qend6 ]' D. K( g( J8 H+ H9 m1 g
复制代码/ a1 u9 q( ?4 ^/ x i
实例:4 U8 U3 s# v7 _6 I7 o6 I7 |
%对D盘下面的bmp图的文件名进行排序- ]+ _7 N) L$ o( I( h3 J1 j
clear/ O4 L2 J/ y* p* _: e+ V0 S
dirpath='d:\'; %路径 " a$ v4 e. U" g. l p L, X0 Vextname='bmp'; %扩展名 L9 t& Y/ [: b+ m$ N
/ I* j7 M, T2 Z7 |6 u! e
if dirpath(end)~='\' %如果路径后面没有加\,添加7 g* L" X0 }' C: u
dirpath=[dirpath,'\']; l6 Y2 f1 Z/ n3 Aend6 I- r6 n7 H$ a p8 G- b% a
$ Q3 l7 K% K/ O, y0 Y6 V& X9 i%先取出目录下的文件信息8 C- _. b& s P K) x% H" I, e
pic=dir([dirpath,'*.',extname]); 4 c5 Z3 Y$ m2 e6 r0 {filename=str2mat(pic.name); %取得文件名 + s# n S. K/ V' w; A8 D% v4 L' n, N, G- r& |' y
%调用函数 , S( ?6 a; b) h7 q1 ^7 Xsortfile=LengthSortStr(filename)) _# q, T/ f1 F' ? I, S
复制代码/ b2 ~1 H' Y% k' d" b6 x