- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
$ [$ t3 w4 z B/ J2 D F( R+ a2 v0 J" a手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是4 J' j9 T9 d7 l& C( H( C. n6 a
1.jpg+ z) l* m& _) Y T' Z. m. \
10.jpg8 s' _5 n' `6 r) x' i& }4 @
100.jpg$ Z/ B' j& O4 G1 _! h N1 d
101.jpg8 N) S4 P$ R/ D7 P K9 ~
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
% M+ X7 c1 y3 P( `' ^" g+ p! Y
" p' c7 U" j* J& k% r当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
v" ^3 b; c8 ?, c% a当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
4 Y& j$ J" _, u7 R4 W+ k: ~" ^3 k如果不是上面两种情况的话,本文就是实现从小到大排序。
+ L2 b8 v6 t4 M" F5 W% G; b9 T6 y3 L0 e0 g2 g
/ C7 t: T2 w/ \8 L3 t" K7 Y; n
提示1:文件名的获取% Y, T" i: `: ~& r- j u6 n
通过dir可以得到目录下的文件名,比如:* n: C+ J- k% z( R. i3 G1 {8 f
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
: H2 I, c' n8 {: Y! a6 n$ Efilename=str2mat(jpgfile.name);
" l+ d* A) R7 b' W: q6 F+ O$ ^+ e/ s4 X0 n9 s
提示2:字符串数组
& Z* P3 }" S2 @/ S先试一下:
! ]- Q' ]) \2 T" s2 Y3 fstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
% [. x, N- n6 e5 ?+ Istr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同% T! ?: ?& ~/ ^; ~( v0 Q
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。1 t' _7 e$ z% |( r
' `! ?9 _9 s6 `# V9 g. R这样就导致上面得到的filename每行的长度都相同。7 @' b7 }5 n) t- e8 `, Z8 j
+ ^7 T0 q: f& Z' b( e4 [
1 U! {8 c1 h& s! P4 b1 @: d本文原理:3 B2 H$ v0 L- A4 N3 ^
先判断每行最后面有多少个空格,
$ I2 y7 J3 p7 E) Y& Q然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串( v+ h% ^- n' r4 Z+ z5 Q
这样排序就可以实现上述的文件名排序功能。# B+ k7 |4 J+ s7 |) B+ G4 d
' Q+ @, g/ Z4 _0 v: G
9 z- S5 d8 Z; j( f本文代码:' |; X4 n. g3 F' G3 ~
function varargout=LengthSortStr(str)- |9 H' s4 I- b1 W; ?! Z- M, W
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ i v- Q8 o2 A: E t9 \& k( f3 o%Argment: str文件名组成的字符串数组& i2 e( L9 F( S7 `
% : 输出参数同sort函数 f8 |* i4 O6 M& X" [
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x0 t' K3 X" W1 k+ t6 G
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
! F/ L3 j" j' A6 C6 c ^. S$ P$ f6 \# P
[N,MAXLEN]=size(str); %个数以及每行的长度: t/ h4 f1 a- x
newname=[''];( n/ ]# o" j3 Z2 h$ F
6 M- L& j& T" y4 F( Hfor i=1:N- \8 @0 O! F0 ^9 P+ v
BlackSpace=0;
7 u) H; q! }+ {& x2 w" r- x while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
, q* {! M! U. l% L: ~( f; L BlackSpace=BlackSpace+1;
7 t y5 R4 \6 D9 O1 Q8 T( I( U end# Y$ D6 m- b0 ]: ?
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格& ]% @5 o4 r+ E+ R4 h6 [
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];3 m! A+ w C8 Y7 x7 O8 V6 c
end
1 M( c5 C7 W1 E- J+ Q[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
/ N8 c2 l8 K" @5 a# W& P6 s2 e: usortstr=str(order, ; %由这个序号生成原始的排序名' b3 U9 P+ `1 G: V2 F
}3 F1 ~" d% Y" Z
if nargout<=1
. r2 S4 z3 c9 f" T/ J varargout{1}=sortstr;
' D- Q4 d, l$ S6 e$ Z6 p) Q' n, ]8 L1 {- a- ^elseif nargout==2
% D8 e1 v4 m; ?. O% a/ z) h2 \ varargout{1}=sortstr;
0 c( H$ K0 @: K) c, G) Y varargout{2}=order; v' ]+ s z5 {0 e
end0 W3 p' t: Q+ G& c, s8 ^/ K
复制代码( I+ q2 a" p( ?+ w+ J) {8 K
实例:
5 d" g: x0 w# H1 O: A%对D盘下面的bmp图的文件名进行排序; e- r( o* R+ t3 d- ?
clear
. t9 B% T1 `+ K/ Hdirpath='d:\'; %路径4 O4 H8 G, ]' s" u
extname='bmp'; %扩展名9 e) V! {3 _" L' z8 q* g
3 V* j8 X9 t9 Z0 F" f
if dirpath(end)~='\' %如果路径后面没有加\,添加& B5 p2 W8 c2 F
dirpath=[dirpath,'\'];
' c4 t; E1 |# G+ V8 r* |end$ `7 V1 }; y8 g) Z8 C
; k: h3 q0 R$ n7 @4 W$ J5 `# z
%先取出目录下的文件信息
+ i0 S5 C) [, w \2 H! T. K, Epic=dir([dirpath,'*.',extname]);
. f7 W" E! ]1 L' i. a' kfilename=str2mat(pic.name); %取得文件名
7 _% L, d7 O+ I. p5 j; M8 w
8 ]( ?" M- K6 |4 W( s8 J: G% Z%调用函数1 n% u! H! d' J) A& R* M0 R* o* y
sortfile=LengthSortStr(filename)* ?* v. X- \1 M" d8 m( \
复制代码
) q4 h5 J- A4 O& P: x
- J" D0 s5 ~" w3 q
: k5 V3 Q0 e! F0 ^6 x" C- y9 n% \- r- L |
zan
|