- 在线时间
- 1084 小时
- 最后登录
- 2015-9-10
- 注册时间
- 2014-4-18
- 听众数
- 162
- 收听数
- 1
- 能力
- 10 分
- 体力
- 43976 点
- 威望
- 6 点
- 阅读权限
- 255
- 积分
- 15250
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 3471
- 主题
- 2620
- 精华
- 1
- 分享
- 0
- 好友
- 513
升级   0% TA的每日心情 | 开心 2015-3-12 15:35 |
---|
签到天数: 207 天 [LV.7]常住居民III
 群组: 第六届国赛赛前冲刺培 群组: 国赛讨论 群组: 2014美赛讨论 群组: 2014研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:! n. u; N* i! c; q7 V! n. o
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是8 ~9 R8 U3 i. B5 h" b6 ?
1.jpg
; M6 J8 ~. p( o3 S L0 A10.jpg
, e* P1 G) C+ Z8 ~100.jpg! {; @' X! j* [7 ^. Q
101.jpg% N: {( P9 {3 I6 F" ], U, p
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。8 Y4 y6 E, I; e- I) \5 ^' g
* M& L. _. r" A: l' j
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
7 L: ^; M0 {1 Z7 D; s, ?4 d" O当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
3 i# d. R7 {* T6 T如果不是上面两种情况的话,本文就是实现从小到大排序。
~7 {4 K) k* k
* M: b% s" @5 L6 H3 v( u( f6 p4 g! |6 T8 Z$ @* }' R
提示1:文件名的获取
: P8 A2 Z9 ^+ k1 d8 Y( v通过dir可以得到目录下的文件名,比如:
& F0 _. V, g& r: njpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。/ L) ?$ a' o/ X* T* r5 w
filename=str2mat(jpgfile.name); ( t9 }* X: i$ _/ Q& o. J6 [) R
& R. w5 R3 H9 ]( G) r提示2:字符串数组
7 g% x/ }' Y n* g8 D+ [) K1 R: l4 _先试一下:2 p/ ]3 L q' \: f P
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同6 K* \- I' M' B6 ?' o- z! L
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同1 @; q7 G4 \# H" Q' g& a
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。 x& B! I# K' ?3 p3 J/ O
4 a& F6 g. X& J; s5 b这样就导致上面得到的filename每行的长度都相同。7 ]# o" K+ x' K
9 P/ v5 [4 ]/ }2 L& Y- b* E! x. V" E: t& f2 O& r" Y! M
本文原理:
0 m: D" f8 |( E0 W- t先判断每行最后面有多少个空格,
: \8 R: W- M- G3 s2 M; F然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
) p& ]1 z8 J! @这样排序就可以实现上述的文件名排序功能。7 Z2 |6 @0 C1 T) H, b! _' S
/ c7 K* q* e$ V' J* A) `; Z! w6 I, ?9 v" W8 }
本文代码:0 I$ G# H( W6 _- |: E8 d
function varargout=LengthSortStr(str)
9 T) o7 k G* y: `* g6 ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%( j/ }: y7 {9 f8 K* v$ _
%Argment: str文件名组成的字符串数组
( S) s/ Z: o) i( P, I% : 输出参数同sort函数6 _, N9 J) P8 V. a) w
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ k2 y4 C5 O2 w% ?9 ich_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好) y9 I+ D" X; _" E8 Q; Y
9 V* Z" n/ Z+ g' v
[N,MAXLEN]=size(str); %个数以及每行的长度; A0 {& p: U: h1 l8 s0 Y: f$ }
newname=[''];
6 {( Q/ y( c3 N$ [
% d5 y0 J+ w5 K, f6 }% u! g# o+ nfor i=1:N% H* b5 ]! @: P1 V6 r- h+ E
BlackSpace=0;6 S$ s$ n7 H6 O5 f ^( J7 P- x0 e |
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格! S# u0 h; R5 f6 o7 r M$ E, i9 G
BlackSpace=BlackSpace+1;* t9 t; ~1 t( `" M4 d0 ^/ C' B
end
s3 j2 I& }& e2 d; V1 ~ %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
$ W+ W& |# X# O. D newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
6 E. }4 p& g2 U! cend
5 j- C) c; n7 f/ V& s% G u, B[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号/ A2 I* G! v3 v- e2 ~. K: }0 R7 ~
sortstr=str(order, ; %由这个序号生成原始的排序名
2 ?, v) N2 U. ?4 b8 ^' W6 R+ }) l
if nargout<=1
3 a1 z( `% _! j" I% T# e% p7 A varargout{1}=sortstr;
3 ]0 _# _+ a. {* ~2 selseif nargout==2
# Z# @% m/ A* k/ Z6 h" R varargout{1}=sortstr;
0 O/ b f, l% z0 Y2 b# A( n8 n& v varargout{2}=order;
; C# ?7 }* M1 T! P7 {. hend c6 e6 K5 L+ \4 p4 F
复制代码
0 h6 }% ]6 N! I; J; o+ ?实例:
8 J( r; S3 ~, u& u) b%对D盘下面的bmp图的文件名进行排序$ j* B* \8 K$ Z8 k. L. z( j
clear
$ d" f! e" t- {dirpath='d:\'; %路径, @; w2 E2 F. {4 y. t
extname='bmp'; %扩展名
! f: [& c0 |0 i' \+ S4 V( h% _6 c6 ~* w4 B3 `
if dirpath(end)~='\' %如果路径后面没有加\,添加9 J7 y0 I' ?3 s+ t( s% {. f/ W
dirpath=[dirpath,'\'];
7 D0 q) j& h: P9 W: i7 l- x+ y Y Wend
- W$ `7 Y. }% g0 r2 w! h9 O
0 ~7 W3 a/ i/ U% ~%先取出目录下的文件信息' s. z/ ]: i$ `% A/ ]+ D/ ^
pic=dir([dirpath,'*.',extname]);6 c0 p# M4 g# i- U D
filename=str2mat(pic.name); %取得文件名
; r3 J( k( V$ O. s
; n& u, D# I( Q/ W, C%调用函数
m" g# {: r* s! x9 [1 i/ ~$ y9 gsortfile=LengthSortStr(filename)7 X: Z4 ?4 `" G7 b1 O+ H
复制代码
7 } w3 x$ P! ^2 m
3 I5 e4 [9 x. D' i( B
( u5 @! p1 ^% f. D4 v |
zan
|