- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:0 b. x; R/ H; d* o5 B! \0 A* j
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是' N( p4 H; h* m+ e+ O
1.jpg* l. R8 \5 o; ~# t/ S( G! P
10.jpg
: m5 q7 V/ i& X; |100.jpg
) N& y4 q) W. n" _ F8 j3 J2 L+ P101.jpg( E" k8 g- r- P, K
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
$ V, U# C/ O2 @ N
+ a8 F( A k6 \3 u8 ?" ?当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
" I4 B' z' _* I: E当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# k, R! e* `4 i9 N( x& D' B4 H
如果不是上面两种情况的话,本文就是实现从小到大排序。
& e+ C: H+ G& a0 [! @. e+ {( p9 j, g' B; V1 J' K; B4 b, ]" q
% h! p7 y# R" w/ c1 H
提示1:文件名的获取! D$ H; k1 g+ y; E! j% j# `. i! F
通过dir可以得到目录下的文件名,比如:+ z! e$ L; X3 l* o& n& J
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
2 ]: j+ H2 z- k$ x2 r% J4 j ^8 X yfilename=str2mat(jpgfile.name);
3 F2 J% P* X9 q7 R, P8 L B: f4 D* y6 Y
提示2:字符串数组
: s) }1 p6 X, `0 e+ p先试一下:+ X9 f( T1 L! s3 L
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
! x* C' v2 J' K% F% ostr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
+ u, H( q6 U* K+ ystr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
% |- E. d* ^) S! h& o+ v9 Q2 O+ [6 u1 u! Q. N% z1 C
这样就导致上面得到的filename每行的长度都相同。8 W4 p9 c. T- \7 H- o+ W
: O* k7 D6 m& ~4 B6 f
0 M3 j' \; N: w( Q; a5 s: m本文原理:
' d' h# m: ~3 d' M8 o: o! _先判断每行最后面有多少个空格,- C( R/ |4 [/ {5 v, W/ ^% a! m
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
/ _2 W: ^, H0 _这样排序就可以实现上述的文件名排序功能。
4 P: Y: e! \; q: m# a/ G" |& Z
* S. k- L3 I. g# ]8 Q0 R' N9 p" O: B: |2 }7 A
本文代码:0 z+ {: _6 H2 L3 w! m5 ?, ?$ Z
function varargout=LengthSortStr(str)
$ `9 y" b+ y& R' p0 Q1 B. e2 S" ?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- _, Y/ x" X: ?5 m
%Argment: str文件名组成的字符串数组% G# r3 @: O7 A* L# _, s
% : 输出参数同sort函数
5 ^- ^; a' }6 ?3 W) J$ [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& C/ K) g3 T3 X9 y# |
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好) g5 o$ p# t0 C. |* ^
' \2 B Y, D8 V8 k[N,MAXLEN]=size(str); %个数以及每行的长度7 S/ Y& \3 G" a1 X8 u0 ]
newname=[''];
" l; R) y) b+ R8 j) ~6 Y, J9 M
* i& J% E* {8 h# U* F5 [for i=1:N* D6 G" f% T$ g' v6 w, Y6 ^. O
BlackSpace=0;
1 m# |, F6 |) Y, Y! ?& o while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格$ G. [5 r7 y3 V; a9 d: f& x0 i7 J
BlackSpace=BlackSpace+1;
+ R* G+ l; K) g% f1 d) X7 O( X/ k g& h6 o end$ l. j2 T O/ l! Q. R& Z8 {
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
0 T& {9 v/ B" s7 j4 v1 F newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];3 x, }$ ` n0 ^4 R2 \3 J
end
4 D, o1 D0 @1 N9 x) a[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
+ N+ h2 U$ Q, p7 O9 T* W! Vsortstr=str(order, ; %由这个序号生成原始的排序名
' h; ~6 `, \5 K5 O% q& \1 M) Y3 @' K
if nargout<=1
4 J5 A( V0 i1 X0 B varargout{1}=sortstr;5 ^, H# I; O6 w6 c3 \8 R* X/ H
elseif nargout==2
6 @1 z$ t: N1 ] varargout{1}=sortstr;
! |! H, K y" u8 R- w; f5 L varargout{2}=order;' w1 k& Y, _' m" D) D
end# }$ e/ \2 S* W: P
复制代码8 B& n+ w% }3 b, k4 z* Y* C
实例:; e/ Z3 O; g1 C$ q+ [; _ n
%对D盘下面的bmp图的文件名进行排序+ p0 |; i) I- O& ~' [
clear
, C) u. m' `) k/ a$ Wdirpath='d:\'; %路径
8 d. ?) {8 s) x% {( k3 Q: Fextname='bmp'; %扩展名; k$ |8 z; x$ }& N! u% o
. m Y8 m% M2 r1 s
if dirpath(end)~='\' %如果路径后面没有加\,添加8 x0 o, ^0 [2 v' S
dirpath=[dirpath,'\'];
: j" |2 Q- a' s/ fend
$ ^7 m* J8 }5 r- u$ e7 i+ C- S" p! O( D8 {, X
%先取出目录下的文件信息
) M8 L8 j! c" G' Npic=dir([dirpath,'*.',extname]);
8 k9 m2 i/ r8 k/ ?filename=str2mat(pic.name); %取得文件名
: j O# |5 j* @. I- h5 k7 G, `" C; t( z! J/ w/ B3 q* l
%调用函数
4 e7 \$ o6 r+ E' Gsortfile=LengthSortStr(filename)8 G* C( r4 K/ m; f+ u3 `% y& V- W
复制代码
7 J! v+ w3 i& j; C3 x" H# j( K$ o
H( Q2 o2 M1 ^) y7 v9 X$ ^* v4 M% k' ^8 F4 K6 _6 V( x
|
zan
|