- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
6 f4 @! G4 c2 w2 _0 h手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
3 L6 a9 g) \9 L% G' F1.jpg
" ?. q& b3 O/ M! j7 V8 j( e10.jpg% s4 W$ T+ m: G6 B' j
100.jpg
% E. K+ X+ T9 i101.jpg9 m/ _3 M q' H2 h. t
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
7 Y9 X& W4 K: H- t. N2 O) V+ E
# b7 f+ b, {8 O! w; c6 l9 N e当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。% D( U- q& n3 j0 }2 @
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# l `- b$ L+ _! z N: H
如果不是上面两种情况的话,本文就是实现从小到大排序。8 S3 a3 i9 z! `
( } a; ?8 i. \4 ?& ?# W
) y8 M8 _4 ^2 a+ \) [提示1:文件名的获取4 \, B1 x7 j# X
通过dir可以得到目录下的文件名,比如:
+ v7 }8 l; G( T+ X' Mjpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。8 ^- _2 _/ P" N: R, }" W- C
filename=str2mat(jpgfile.name);
$ i4 n, Q Z# o# U$ D: f8 u3 A# K; i) \7 l, `
提示2:字符串数组
7 n6 R& D. A k5 j, V6 U! C先试一下:
y) r" W5 q/ W# P3 y8 Dstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同* e: l9 N/ o$ @ [$ ?
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同# O0 E5 d+ w* I
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
( r$ c$ x* x/ P) y, `, f
- x5 H, n" [, ^0 K! u" X这样就导致上面得到的filename每行的长度都相同。. ^6 P/ e, k# Y1 T
' E; I( O7 ~. w3 d& h$ A
/ R0 }+ Z$ M/ S$ p0 l
本文原理:
# a' E3 }0 N4 c- S1 _/ M9 P$ V9 `1 {先判断每行最后面有多少个空格,
- s8 o! t [8 O/ O/ f) u然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串% }8 q: t' H! }
这样排序就可以实现上述的文件名排序功能。$ H% l7 f$ N0 s; u3 t# R- n7 y% \. S
( F7 l% F" L' a. _9 U1 Q2 ?
. x- t9 J0 V- E+ |# ~" O" R! b3 x本文代码:. G$ h% S! C& i4 B( r
function varargout=LengthSortStr(str)3 @, B2 E# @2 R; \7 \
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: b+ E1 U) l' {/ c%Argment: str文件名组成的字符串数组
" z0 m$ ]7 T ~! V) l, m% : 输出参数同sort函数& x* E& b2 u- \2 w4 O/ G! `; B" y
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ g) l0 X C6 f. |! @6 f
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好, B$ e) T$ C6 x" O0 e( ^7 R
9 W# |4 c3 k. z. | h+ Q0 ^
[N,MAXLEN]=size(str); %个数以及每行的长度6 D% a) X! c) Y: B5 g! `
newname=[''];! b: E1 N& G5 M& F- I' U/ W
, N( L% a: n n+ r( {6 \0 L0 B
for i=1:N
, ]" u4 q2 V" x9 Q8 ?8 ] o BlackSpace=0;
' e s5 k) r7 P0 p6 ?2 v while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
2 Z4 ~& }+ n: X ^ BlackSpace=BlackSpace+1;( B6 f! ~2 M* o1 c" c% y% c' J
end
1 p! S8 [, f+ \ %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格# b, K- |& w$ e1 C0 `
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];7 f9 Z, I9 e. m! v, S& p. J/ W( @, i
end
" W) w+ _7 ~. Y0 n) p[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
3 N( U$ P0 R( I! Q z2 e, Nsortstr=str(order, ; %由这个序号生成原始的排序名/ y4 _7 L$ a+ p- j
7 G: G9 X. A- r/ h0 L5 W& lif nargout<=1
8 l# G* n% _/ x" K; o varargout{1}=sortstr;
- U, r7 L2 c+ Z. selseif nargout==2& Q% ^- y5 Q8 u
varargout{1}=sortstr;. i0 x+ r" V: ], T" E3 |& ^5 j
varargout{2}=order;
; e4 \3 L" ?: C7 w! a' a8 z" k$ w) Gend
' P$ {( ^" W9 `( X' ]) ]0 L. b复制代码
. {9 D- g# k3 H- S# r) }: X* |' d实例:. g9 H P7 m& m. ?9 z
%对D盘下面的bmp图的文件名进行排序: V5 T% r/ H6 q# M" \; V
clear
! Q8 u5 e5 { c0 @$ ^$ C6 xdirpath='d:\'; %路径
# u) ] m3 G- J1 ]; xextname='bmp'; %扩展名
x* I4 v! D$ J. [. |) Q A- }( ?3 C+ a* `# S+ q. a
if dirpath(end)~='\' %如果路径后面没有加\,添加
0 W$ Q# k) O& [0 O8 c. i dirpath=[dirpath,'\'];
- V( C" T$ u& }8 W" s. vend& J2 u \+ j8 {6 B
y5 i+ x# W. S! X4 _5 [% g# z! f
%先取出目录下的文件信息
9 I* b. u x N4 Rpic=dir([dirpath,'*.',extname]);
2 ?$ g- I( V, [4 B9 C9 ~5 @filename=str2mat(pic.name); %取得文件名
: D& e T; Q6 ]
7 }+ d( B. `4 g# t" o( {%调用函数0 c X, _2 R; Y. {9 u
sortfile=LengthSortStr(filename)/ u- z* B) X" f
复制代码
. M9 h- l. f0 O! U9 D5 h7 J9 Q# [& P; u
1 Z8 d2 ^! w" ~( ~; T3 s |
zan
|