- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:& a% ^7 N! T- m: l/ F; g
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
' n3 Q0 ^4 ~& T2 {" C T* B' {1.jpg# ]; ~7 d& K( t. G) c
10.jpg2 k; g0 M( s$ g, q
100.jpg
- @/ q1 [; m* h; _8 D1 G6 A' H101.jpg7 k* ]6 s' \2 Z# Q. R9 i, W* U
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
4 j# }+ E/ q1 M% e0 Z: ]# t- l8 h1 ^# |
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
; r4 n% ^# k: M; a1 a/ X当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。) I) ^0 e: g2 Q5 t
如果不是上面两种情况的话,本文就是实现从小到大排序。2 m( _4 b5 @3 q5 |& v4 v/ A
! G- i* w( g5 |) K& B
) J- E2 c6 `5 b" ]& H5 U提示1:文件名的获取7 l# R+ T' J) }
通过dir可以得到目录下的文件名,比如:
* w( x: Y; h3 P5 yjpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
2 o1 k) n& t3 n8 m& E$ h4 vfilename=str2mat(jpgfile.name); 2 T) Z7 q4 i! C3 p& o3 F
. |9 p, l# B6 X提示2:字符串数组, ]( N* V. v( f: `5 S% L8 B. G
先试一下:
+ c5 N+ m& l9 r% \- q# Rstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
% o' }( J+ i4 w, r" W' ]$ ~str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
, x) p* B# r& J: Rstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。$ j6 H4 H4 E& {- w% W; k0 `
* F, C9 K8 S* Z2 E. @" D/ c; z这样就导致上面得到的filename每行的长度都相同。
9 S* h* w! [- ~7 m& P, K' `" n
! }$ J7 V- m6 J, |: i _ v2 c t
5 T( }! W l8 E( A* r本文原理:2 R% j2 q0 T# e' d
先判断每行最后面有多少个空格,+ \2 E2 r# r$ \* g, N
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
" P, _" @) y/ }/ K+ C4 F7 Q$ n0 {这样排序就可以实现上述的文件名排序功能。3 z$ S0 s/ s$ j
- S+ u$ c8 B# F3 u* }" h
6 x- \# o, L0 t5 M! y0 Z本文代码:
& A, T0 T8 X( Ufunction varargout=LengthSortStr(str)
5 M' P l0 o3 e3 {8 k% f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ r- h. ]& e, R1 u# G% J%Argment: str文件名组成的字符串数组
) k8 A$ N1 D1 {. l! n# J8 [% : 输出参数同sort函数 t1 s# A% Q- C: M& u" t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ D. t5 ]+ b$ k% G/ {3 ]9 e4 wch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
8 b1 q+ b8 t) \5 W4 w7 ~$ Z
, Y/ q' R6 ^/ ]! h/ E[N,MAXLEN]=size(str); %个数以及每行的长度
$ ^! `4 ~7 v+ W' c$ {1 {) |" Cnewname=[''];' Y/ i* v+ I4 ?, B1 {" [! M1 U
; @$ V1 m8 F% x# ^2 l7 _, K; S
for i=1:N
2 ^" f r) r# } BlackSpace=0;/ g f5 z* g& _3 p
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
) g: ?1 O) l9 I# v* b+ U BlackSpace=BlackSpace+1;; t7 {/ w) G8 i
end
0 y- _% ~) v; T7 x0 Z) h %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格5 I3 d& l, G \' Y
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
: M2 n7 I _& g- o( D- Q5 `end3 C$ g+ n' } H# ]+ {
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
5 d% L! B z* C, y$ A1 Ksortstr=str(order, ; %由这个序号生成原始的排序名8 D& E- o& I, ]! U6 D# K5 @: Q
( l: O6 G6 O" z( P2 Y0 q6 L5 Cif nargout<=1
! ~2 C R; z, q: P& g, y varargout{1}=sortstr;
; o8 v2 m( Q( Y- M% x3 b& F; Belseif nargout==2- W/ k$ v+ g* j3 C
varargout{1}=sortstr;$ c+ S1 {' w& ^
varargout{2}=order;
! u8 o3 ~1 {* iend
2 \+ H% i) V x复制代码
" a% k4 C# s$ Z' Z% i6 K实例:/ R! k+ o- h! ~( S
%对D盘下面的bmp图的文件名进行排序
- p& l, G1 O5 rclear7 I; H" t6 P# L0 \# K$ [! W1 d
dirpath='d:\'; %路径8 y, A6 j! ]* I. G( o/ u
extname='bmp'; %扩展名9 B/ o4 G- p& \& H0 O4 N- R, m
# o! N6 Q0 p& T, h1 t0 f3 Qif dirpath(end)~='\' %如果路径后面没有加\,添加# i' h& f- L3 ~. S* S, z
dirpath=[dirpath,'\'];& {3 L% K! S4 ?$ y+ [
end
- S& E% }2 {4 P) }, m; N# Z6 ~+ p) p. t% W2 Q; H
%先取出目录下的文件信息& `0 O# s+ }# o! r6 Q# `9 i
pic=dir([dirpath,'*.',extname]);! n% E0 B9 O0 Q& m, K. g5 R o: Y
filename=str2mat(pic.name); %取得文件名0 `* l/ c1 Q' j' ~
+ q. J9 Y4 t9 |9 P8 E- P. q, s2 q: u%调用函数
- t, n. b" S2 v8 c% z# Y: ?/ Ksortfile=LengthSortStr(filename)
( y, d7 M8 r" Z `2 E9 o8 s复制代码: B( l9 X q! t# D- A- B* R
: h; `7 b; o- l$ I4 l9 |
& F' i3 n ^2 G |
zan
|