- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:/ W1 n4 `7 \2 a
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
; g7 b4 b$ u$ j% ]* S1.jpg
8 b6 w* G! [. M6 e10.jpg
( Q# d; n2 \% X) T: f100.jpg
+ T, I* A2 G1 y! |5 ^& P101.jpg$ X/ _" O1 ?! ^
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。3 \1 o4 R/ V" w8 K
: B: b9 D! L0 C3 R( F* t当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
2 v+ Z0 F4 q' ?: S9 k当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。2 C# i* |* o9 F! G# ^6 I0 @$ G" f
如果不是上面两种情况的话,本文就是实现从小到大排序。
8 X/ a/ |3 O/ n+ G/ G: z$ y6 r. O2 ~* L2 j3 G( H- {' g" _6 l
5 _( e4 T( j4 v. |* n! j; Q
提示1:文件名的获取
6 L3 _7 c8 l0 g$ U" `. f5 K7 [( ^通过dir可以得到目录下的文件名,比如:$ I7 Z* a5 v( q( p
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。7 R5 P' G: @ S& v
filename=str2mat(jpgfile.name);
. r/ }; t: Q m; R- ~) a/ P b) |- F% m% S/ |+ H" w
提示2:字符串数组
: a" K0 W+ S# k: H% M5 w先试一下:
3 z7 S% t9 L. R7 U# d; Qstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
+ Z- L2 `3 o: j* e( _: `7 ^str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
2 W7 z4 A. B- k! t6 o% U Zstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
& d, W8 ?3 S1 \ N) V9 `, w
8 W# k O* ]6 F这样就导致上面得到的filename每行的长度都相同。
' ?' q/ C0 P! f2 V+ Q& C+ y
3 t' i' A0 Z* ?
0 I+ E. T) i2 O9 x$ X9 K4 u本文原理:% o# V7 L& u6 k# z* O6 n
先判断每行最后面有多少个空格,
# p% G6 L" Q- W1 b) X" p1 J然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串3 d1 S5 m: ?$ r) x" Y
这样排序就可以实现上述的文件名排序功能。
. M# ]8 x2 m+ p4 I z8 h' N9 C
* D4 l4 L9 s# O; l5 ^5 m S3 B2 W6 z- ]. {
本文代码:- f- A) S" u, E6 r8 B& j( r
function varargout=LengthSortStr(str)/ H k; o) x+ B/ }$ a
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: l6 R1 b7 O* Q/ Q! ^3 I%Argment: str文件名组成的字符串数组! w; k5 n) [) \. t
% : 输出参数同sort函数0 k# d! v9 V9 V5 \, w2 w
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( N$ ?) B4 z0 u2 r$ ~ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
7 w% U" ?7 A7 \1 z: b0 w% U# P. l+ H H8 ~. K& R3 U
[N,MAXLEN]=size(str); %个数以及每行的长度
1 h* H3 H+ R3 A; F* }3 s4 p. S: N7 Inewname=[''];* I8 B1 G, H1 }# x b4 E
6 S) F5 d- x6 G1 \, P9 M
for i=1:N" J+ d4 m, D0 @7 `- F& X/ Q4 J
BlackSpace=0;
7 ?* O' Z# ~- y' ~ while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
% v0 x7 ~, E9 Z, V* x* `7 X BlackSpace=BlackSpace+1;7 k# T" ]; f7 g
end7 X3 g/ p& J9 @; Q8 p
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格" G8 Y+ Y$ ?" ?. \3 g; ?$ v
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
' b" F9 a* u5 p. vend4 v a B: w( m- f9 t) W, v
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
9 Q( W' C' ?2 A7 E4 u) q6 Psortstr=str(order, ; %由这个序号生成原始的排序名/ ]% \ \$ M9 ~9 S3 k \. J
3 S; m0 C! v' M C; T/ N6 xif nargout<=10 t4 i$ @- s# W2 m
varargout{1}=sortstr;4 r8 Y, I1 {) w/ t% M6 }
elseif nargout==29 O0 P c+ B: E( k4 m; D8 w- ^) [
varargout{1}=sortstr;
( Z" p4 H( w. ~5 N varargout{2}=order;! c0 z" L( e" P, q! e
end( f+ ?" T6 [1 ^. M+ s/ V
复制代码' P6 C$ N" R& C% F
实例:
5 V! I' \6 r0 T; F8 f1 W0 W%对D盘下面的bmp图的文件名进行排序$ p2 Z+ q% _, O% @- x
clear# U$ j0 o9 Z9 Z/ k" a# w5 z
dirpath='d:\'; %路径
/ A0 M9 [/ E( v) a# Bextname='bmp'; %扩展名
& C' i: V+ e& t2 R% F( ]" S' a7 y7 P0 g0 _
if dirpath(end)~='\' %如果路径后面没有加\,添加7 P( @% j: G/ W+ N) y& ~1 l
dirpath=[dirpath,'\'];
2 {+ b: v" Z/ f* |2 Hend) n- Y% e: D; ]) Q, U- _
4 x* B" ~3 d4 e%先取出目录下的文件信息
4 l9 Y# R! j& ?/ S( Y; v; I; Gpic=dir([dirpath,'*.',extname]);
; z/ q0 j( K' h# M6 l& ~$ Q& efilename=str2mat(pic.name); %取得文件名
% m, L) |1 q- O( q$ @" }) g/ A5 c, l$ m9 X8 W/ ]
%调用函数5 ?9 O) t' u4 @6 V& B; F1 B
sortfile=LengthSortStr(filename)
2 a# B. Z) t& @' g* _复制代码
3 q/ _7 F% X& [9 r% c2 ?
O7 B: ?' O! S8 B- T$ @* m$ H- _2 i+ e% ~
|
zan
|