- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:7 n" K+ p( n4 H: ?/ ^0 X( s% F
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
! m9 h. S; i9 k( H1.jpg; ~+ ?" P3 r: l5 h. f; h: W
10.jpg
2 A% @- i% G- u$ B6 `4 h! ]100.jpg& q; p* F# z: G2 Z6 I2 u, E
101.jpg/ ^9 c% _8 {" C% T
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。% A* f% }" [. k2 ?+ t3 Z: q
/ v8 | J, n% K$ b" F当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。) ^4 ?0 I( S; ~
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。& k% Z) M$ _8 A$ k2 t% y" j' r
如果不是上面两种情况的话,本文就是实现从小到大排序。) h3 o1 X l7 e1 ^ ?2 o. h7 q4 ^
0 d7 d9 k2 Z8 y, b& o
6 X; k$ _- ]$ w8 J+ }
提示1:文件名的获取$ ] P3 i, f4 ]: l# m y9 _
通过dir可以得到目录下的文件名,比如:# J/ Q$ r) f) x( |7 Y0 D) Y7 S; a
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
$ h3 [2 F8 S) y5 j2 F$ P/ _$ Efilename=str2mat(jpgfile.name);
) Y5 u/ ?% d/ d) y
; V, v* _4 d" ^" h提示2:字符串数组+ K9 l/ }/ }0 p( r, b
先试一下:
7 v0 k8 I$ Y0 W7 r, X, O1 F( {2 qstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
$ \& {+ V' K& I8 a2 q0 Istr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同 Y5 |) `8 w e. ~& E) Q! y8 m5 Z
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
; K8 `' S) _$ p+ r2 D7 J ?/ ^0 H+ j/ j: l. w4 { B/ u2 j7 U
这样就导致上面得到的filename每行的长度都相同。
6 v5 Z, _+ k3 a6 p4 @4 [8 Y9 _/ \% i" g8 b4 U' T' T1 K
6 r7 ~6 Y) z* m# v0 w1 V0 C
本文原理:
: v2 Z& F: ?! c( @先判断每行最后面有多少个空格,
. D6 q2 g/ F9 k$ d; o+ w" s/ K然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
: n3 W1 G6 X) ~0 _8 f/ s这样排序就可以实现上述的文件名排序功能。8 Q( V4 x9 _' S! I; L6 m( |6 N! h
5 s- s S c* m0 [" ~: n6 N
) x2 g$ f% d$ }) X, { S本文代码:
" M6 _4 z# \4 h) J! v% B* \function varargout=LengthSortStr(str)3 F4 V: r- [+ Z2 m! q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! s3 H% [: j2 g$ ^! j/ G! |5 }8 k
%Argment: str文件名组成的字符串数组: ` I7 \1 j3 q% y% \# F
% : 输出参数同sort函数* F+ A. z' {; ~% m% N# }, a
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ P- R0 b6 T) E- S
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
: L2 G4 y3 e5 C9 c7 B+ h
6 `% r# v2 N5 y) V4 h[N,MAXLEN]=size(str); %个数以及每行的长度
3 P% u) g0 x, ~' I9 a3 I5 Rnewname=[''];3 X3 \, m' _" y& {
! o, b+ e3 ` @- Q* G- i
for i=1:N
, f( M6 ~& C7 L: v& f, I BlackSpace=0;
5 O" g5 c8 x& f7 P5 a while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
* F7 A' c' i( f" P& a9 a BlackSpace=BlackSpace+1;
' U& L( ]4 ?0 h8 o2 {4 e8 A end" \. g/ p1 D2 m) s% Q5 T8 t' f
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
% k: n' ^6 M+ u; q; h newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];2 H: R9 F9 ]5 }
end
: F8 L. l6 s0 ? n* I2 G8 F( }4 p[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
& r" A; ^. d% p8 m: { N9 Xsortstr=str(order, ; %由这个序号生成原始的排序名8 z1 W1 Z; e( c
1 P5 l7 t4 k7 t9 C9 J% Z# m
if nargout<=1% z% O# ?% R7 _: f7 M X
varargout{1}=sortstr;/ K* w$ D4 ~1 f% Y
elseif nargout==2/ } q# a0 |2 m! \, ]
varargout{1}=sortstr;
/ p' U% c0 G" W$ c2 K5 ] varargout{2}=order;
2 [+ j5 i9 ^8 t$ F* i. c. J' R8 send& k% R7 C; ?0 ~) O- |
复制代码9 ^$ Y( }$ ~ ]9 n8 Q
实例:% [$ Z' |. f2 X. o& g! ]$ K
%对D盘下面的bmp图的文件名进行排序
2 a% `4 A* ]+ K. I. X2 y% D4 ^, d6 N7 q1 xclear
/ y! [4 {8 A9 w8 t* F9 c( S6 K0 ^dirpath='d:\'; %路径
8 ~6 v* F: X8 z6 K7 bextname='bmp'; %扩展名
: l" ~6 W8 f5 H2 i1 K- p' n0 j2 B) j+ [# ]
if dirpath(end)~='\' %如果路径后面没有加\,添加
8 R" |( g: G; r I4 E* s% v dirpath=[dirpath,'\'];4 D3 T( `: i: b3 J: g# t
end' c5 q) L; v' v" S% c0 }
+ G( b; C' C# n6 l
%先取出目录下的文件信息
1 P* y$ ~ \% L7 l6 V% l9 bpic=dir([dirpath,'*.',extname]);
" k. a7 {1 Q! Mfilename=str2mat(pic.name); %取得文件名
9 m! i9 `+ S9 Y" E. j* e; w' c& Y6 L/ w9 j$ \
%调用函数
# u; g3 [- ^6 wsortfile=LengthSortStr(filename)( l# E% O1 Q7 a' b1 F3 C3 g
复制代码/ y% {4 D; r3 ^' S2 n
y) u6 Q6 R9 {+ ]3 D$ w; N* l0 H2 Q4 w% H' i
|
zan
|