- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:. y! m2 L% Y' K# ]) z. ? S
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是7 Z/ q n$ {1 S4 d( J/ S
1.jpg
, y" ]5 Y$ b- R10.jpg
7 ~$ a( O8 o3 m/ Q) E: u: q U2 c& K100.jpg7 G& R2 C6 C+ ^" o# T8 h
101.jpg
7 @6 y7 t' ~$ K6 A }2 \* y就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。& {- ]) B0 y2 w
" i* S/ `. O/ I2 C0 U# @当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。' i3 y* i, O8 V) _- R
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。4 L0 A' E$ k% D3 u
如果不是上面两种情况的话,本文就是实现从小到大排序。% H9 V4 f7 @+ D- x
! ^( h5 J* I/ q9 Q& ~1 z" w- r
+ \( Q( _1 N7 l( l( l提示1:文件名的获取2 \: r9 X/ Z' p+ s* I G3 I7 O
通过dir可以得到目录下的文件名,比如:
) `8 J/ Y/ K6 s# }: e5 ^' \jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
) e# B1 r$ p+ d( Gfilename=str2mat(jpgfile.name);
; y5 p# j* h4 x/ u$ u1 Y" @- L, P2 s) q% f
提示2:字符串数组
* g7 i1 m* L; U+ [0 v' F先试一下:
; m' e i% b) F; |( Kstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同2 Z8 \6 M: d/ Y' u+ w) `
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
6 m" a4 A6 x" k* g+ h$ ^, k1 Gstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
, E8 H2 d0 x% |; \4 Z Q) a; |2 L
* s: [& r9 C B! U# M这样就导致上面得到的filename每行的长度都相同。
- M7 s* t+ Z0 l. ^; a3 ]3 p) R9 K& B0 T6 J q
' k' [6 K# y6 @+ ^: M1 _
本文原理:' p# O/ a0 j; ]) I! C( b5 D
先判断每行最后面有多少个空格,+ P5 ~) B$ D) \( \( R
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串4 W- }/ l% [. m* k+ @8 S2 Y1 e- _ z, R2 T
这样排序就可以实现上述的文件名排序功能。/ w- t+ N2 s4 E
$ `6 L, S" x! M
) ^0 V/ c* A( k6 B4 T! \本文代码:
3 w" `: _( Y0 M3 _' O# l" ^function varargout=LengthSortStr(str)
- [, a6 t6 o6 x, J$ N: V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; c E8 R6 D" X3 x
%Argment: str文件名组成的字符串数组
: b" `) H7 B5 E2 s! j- u0 J3 Q$ n5 q% : 输出参数同sort函数
7 L. [7 S6 j+ U: q4 j9 w& \3 G%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. @$ {+ w; q$ ych_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
& E5 _% k8 D* [: y, T! u' U' ]- n- Y, p1 T+ ~ A
[N,MAXLEN]=size(str); %个数以及每行的长度
2 r. O% g! S* |' a9 y. O5 x2 cnewname=[''];
) r+ n; u# e/ @: H3 c; U$ s3 x: d1 [5 E( E- F$ i* l* v8 u4 _ c
for i=1:N
" U; a" r' n$ I, P# L5 T" f; K4 R; n k BlackSpace=0;
; X4 z' ^, F, ^& L3 }6 }. G while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
# b" C8 B" y/ `/ Z9 h6 H8 l& L* ` BlackSpace=BlackSpace+1;
" |' c; J" P) B+ S# {) M end1 r+ ?$ H0 X9 U, y4 p
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
. V7 R- m# h3 I& U# M newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
7 _- B9 U$ l2 C- k2 b( s9 vend8 b$ L) a9 d6 N5 R
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号3 Y9 K: h0 K, g
sortstr=str(order, ; %由这个序号生成原始的排序名
* U( ?% V0 k5 c# d1 A8 h/ C$ E& E" }8 i- c3 Z9 R# F
if nargout<=1 V) @% |1 d( T
varargout{1}=sortstr;
! m1 w# h' C. Q, L6 zelseif nargout==2
8 ~5 Q/ L0 p7 l* Q) M( _: a" g varargout{1}=sortstr;; v# u! G$ p! q% _; M# O( A
varargout{2}=order;
h+ ~' V* d# N/ Y) Mend
" D7 b3 v& p) E0 j$ ] X# ^7 L复制代码1 \& F G: e" i" M( y% ~
实例:! z$ g- A& t$ X$ m& y
%对D盘下面的bmp图的文件名进行排序5 V/ p6 M% t" H* v
clear4 i1 O" p6 X4 t
dirpath='d:\'; %路径" T. K3 D3 ]2 ]0 `' Y
extname='bmp'; %扩展名
x( T: p! p+ [9 V5 a7 G* k
, P8 p& L" n! H3 C+ lif dirpath(end)~='\' %如果路径后面没有加\,添加
- l- l0 s& f/ c! W2 X! W+ {8 c dirpath=[dirpath,'\'];
+ Z* Y0 @' c0 z8 v8 r5 N, qend
# l9 y3 o k9 s' x& R- M" c
" c) n. y! ?" `5 o& g%先取出目录下的文件信息
! `' P+ A0 U* C! S/ X5 p, hpic=dir([dirpath,'*.',extname]);
6 U% |7 {0 z( e* X" y5 P4 Lfilename=str2mat(pic.name); %取得文件名
& ]1 P- @& P# i& e4 q' S: h8 Z6 z2 J# Y
%调用函数
4 |9 e0 ^+ r" _3 tsortfile=LengthSortStr(filename)
' X$ _' ^8 [( N4 j复制代码
! @& y Q' u7 r4 H V1 a: F# J2 D8 }
1 f2 @" V+ ]7 F
|
zan
|