- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
4 N; Q; o# k* M1 j; Z, m手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
) u; B, Z" W& j; p7 E1.jpg2 l! [- D- [. u
10.jpg
& P! m3 _$ F5 M9 Y& X: o- Y100.jpg
/ B( }& j: c+ }5 i0 q6 c( N# _101.jpg
" r; c; B( p. F) K# {就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
% {* A) P G- c5 R" C
# w* D+ l/ W, v+ K5 H# B当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
: Q- Q3 G0 C# h* L当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
- ^, A' \- F7 N8 q# H如果不是上面两种情况的话,本文就是实现从小到大排序。' L' g6 ?. N+ a N% ]) [2 W
8 G, k0 r2 J# ^0 B- j/ m$ j
9 p8 X& {8 X2 W提示1:文件名的获取' W6 q' K. s- ]0 v
通过dir可以得到目录下的文件名,比如:
# c2 B# q/ V+ [! ^5 _jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
6 a: F' v/ |$ `* v8 Pfilename=str2mat(jpgfile.name);
3 e( G4 r; j0 [* `* A4 ^8 \" e2 @$ ~! q+ w
提示2:字符串数组
& H6 D7 x8 Z: y7 S. p先试一下:) b( B; c3 {7 c9 W0 ~
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同8 W; P1 C: X* l0 a1 E+ e
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同! [( m; `+ l4 s( ^( ?5 {3 h
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
$ Y! O3 J6 `2 U7 G8 m% m9 U) i
7 J" ^/ {$ i$ Q" X6 r( e6 ?9 G- P这样就导致上面得到的filename每行的长度都相同。- L9 \+ z( J+ B3 z7 d. O
Z1 z) ~( ^7 S9 U
% X2 j- Z4 D/ d% Z3 o: }% \本文原理:
4 ~( J9 W `7 v8 r5 g先判断每行最后面有多少个空格,* {6 `- r2 ?$ c* C, K; J3 s/ J' o
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串" @4 J! @ ?$ ?1 `5 m( X
这样排序就可以实现上述的文件名排序功能。
2 x& Z6 y) F0 _. U$ T% ]& {
% H7 Q$ a/ s2 W( j& C* x& @7 c4 E% B6 y1 }+ z6 z; ?* l2 g, A
本文代码:; s" c& a% q ~# P
function varargout=LengthSortStr(str)
3 O, v- R6 G- B, F' l$ D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) B: |+ @- m. }+ P$ k6 G6 s2 c0 N& N%Argment: str文件名组成的字符串数组
3 I. h% T6 f, g- ?$ o0 Z$ C% : 输出参数同sort函数7 B, T2 r' T: w) U7 X: {, {; }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! i5 U* E$ o. D4 I8 W; O
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
/ i! M. J( V9 H4 _1 |
: ~+ Y& M* c# x2 N[N,MAXLEN]=size(str); %个数以及每行的长度
3 U# K8 t5 f+ a& s; T- f6 b, b% N- Ynewname=[''];$ G8 F; W I& @, U; H
1 B/ G8 c; b. d8 P) j, E
for i=1:N6 Y( _4 f( k$ G6 \
BlackSpace=0;, \+ ?1 z- {* i2 I' D* x4 u$ l( o
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格$ I# _( m w) M6 D3 o" X
BlackSpace=BlackSpace+1;& x* K! j$ O8 T ?& G
end
$ {7 w8 _. X5 [+ J; |8 t %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
) ~) t/ a G) ~" @& J7 F newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];6 ?! C* d/ f! U8 g3 S
end5 Q, b4 M! j9 d4 M9 A1 p
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
( F% h' w- p( Jsortstr=str(order, ; %由这个序号生成原始的排序名
6 ~ ? d: z# }: K4 m" ~! F
* z1 }2 S) [- J$ G- ?1 xif nargout<=1
+ y! v- g% e. H4 @& X) V varargout{1}=sortstr;7 @; h( c& s, F3 v4 V, H( s
elseif nargout==2
: p4 X- H7 J- F; R& J+ E varargout{1}=sortstr;6 ]. ?1 `& G, N# y: y& Q
varargout{2}=order;/ ^; T0 C; x$ w
end
; O7 E; H; H( Q; T- z1 F9 V! k复制代码
" J, A& f+ B5 y, b" X: i8 h实例:
/ ?2 [( R; v L3 O8 H G& Z9 t%对D盘下面的bmp图的文件名进行排序3 r2 r( a3 n, [
clear
& ~* v7 d9 s3 C+ s7 ?4 l4 I7 ~dirpath='d:\'; %路径
" s9 A4 a8 K4 D) Mextname='bmp'; %扩展名
5 U. E9 Y& v/ U7 g$ N
a V8 H: ^& j( \ R* d7 nif dirpath(end)~='\' %如果路径后面没有加\,添加3 K, s! n, b" K/ }1 l; L) }
dirpath=[dirpath,'\'];7 \; _ j1 {; p3 R. `$ [6 a) n
end
9 j3 J( e9 n- @- g1 g- O! z
" l# H" Q7 y) m! o9 h%先取出目录下的文件信息3 ^# n# O9 ~3 E) E. l& ]! d0 n" A
pic=dir([dirpath,'*.',extname]);
# m* J4 ^" k' t; Z. tfilename=str2mat(pic.name); %取得文件名3 ^& Q! i! f7 |5 }
+ C- m: P! A) Q! j0 C* G6 @" ?%调用函数
! e: U6 S8 l. _3 q! X; m; P0 b. bsortfile=LengthSortStr(filename)
% R) f0 |3 h: _% F! [% g6 B复制代码0 O5 b+ \0 \& T7 p
- G H& j6 G @6 u
# I( E9 U/ [ a$ h/ g3 F! l
|
zan
|