- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:) J# x# ~% L P0 |. L X; Y, E
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
7 ]; ?9 R. a# I: V1.jpg% v( N4 K3 E8 S
10.jpg
! |5 m' m! H4 \' i100.jpg" v' o T$ B+ h' D/ Y
101.jpg
' d/ v6 [: v9 X" t: |% a3 N7 B就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
8 X& v9 M" P* I) I/ }1 I
$ y) c4 ]9 P: x W当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
- v& Z2 V4 G8 ]( y当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。) ~5 A7 Q# l9 z- H* D4 z3 v# W
如果不是上面两种情况的话,本文就是实现从小到大排序。
* g6 O+ g9 N- n, X4 J
1 K8 |' E' J2 T4 P- B* h& `
7 B5 n! R8 s; t \ ]8 L提示1:文件名的获取- T U: I A5 F! V& s3 w7 Y$ ^
通过dir可以得到目录下的文件名,比如:
2 G y, ^( V: }- ^jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。' C: X" C$ i) ]! a8 |
filename=str2mat(jpgfile.name); - o; L7 j/ }+ V' E
/ b1 a$ Y2 [. |
提示2:字符串数组5 ]3 J6 O: }& d7 | k4 W
先试一下:
- ] N& K: a f( j G2 r+ D. {' w* n1 wstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同' `4 I7 H6 ?, U I3 Y
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同 r! r1 ?# p7 a. A" U4 e
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
! N! e: `. V% O5 n6 s6 V$ }# L; b& s- h! b
这样就导致上面得到的filename每行的长度都相同。5 G; B8 c/ U" U: J& x2 x
( l0 Z4 ?& ^& N
6 B! y8 Y" }' ?2 d本文原理:+ b2 j8 p: l5 q- G, [% x/ a) a
先判断每行最后面有多少个空格,
" p4 j5 K, g# n' c# ?8 T" n然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串- R2 r8 U( O# _& s* [3 W
这样排序就可以实现上述的文件名排序功能。
, O3 m" t- F( U. n& T, n* t, e$ \9 h" x3 r
. o1 g4 Q$ n7 N5 n3 B2 S, Q本文代码:
! p# Q/ Z E" |3 N# O$ Dfunction varargout=LengthSortStr(str)9 I( M# V( ~4 y6 ^
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |; c, s! I$ F3 d, T
%Argment: str文件名组成的字符串数组
! {4 h8 r* _5 Z v% : 输出参数同sort函数
$ l" g1 W8 |- g8 ]' o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% j5 d7 |6 x) a3 ech_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好& o3 v3 K1 O9 J# p
" m6 |& a! y) T& J) w: d- S% O4 g
[N,MAXLEN]=size(str); %个数以及每行的长度( _" T' j# \: |: ~7 _; l
newname=[''];6 P3 t& B- H' J* S, z: H! C1 }
@/ F2 Q4 j. C# q$ M6 U Hfor i=1:N
* Z9 _/ q4 t3 {7 M/ i BlackSpace=0;7 }$ _6 R/ t) g3 x: z
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
" _/ K) ]* M! t% X# | |/ { BlackSpace=BlackSpace+1;6 D+ X2 d4 \' j1 R9 R) ^
end
, x) b+ C+ s1 k5 E3 i( S %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
: B, o# T5 h3 l$ A/ d! R newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
7 I. n. N* g: [" R7 P8 I2 ?end
8 |4 @" M+ z- \" J7 J2 G[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
" x; M( _5 e' ysortstr=str(order, ; %由这个序号生成原始的排序名3 a6 R9 k" y4 `* K! \4 m7 [; L
0 X# I7 E# S+ M {) [9 ?/ S; y9 {if nargout<=1
: f) {! c! A8 a6 T; L8 f varargout{1}=sortstr;* U; p) C5 R! S2 r/ M! S" ^
elseif nargout==2
% x# M. X1 B8 L- |: O varargout{1}=sortstr;% [2 t: P7 e( s; g9 O
varargout{2}=order;
6 L0 f& S! ]4 g4 r6 D. M8 B7 Vend
1 l, t" t) T9 w7 m7 S复制代码
4 K7 N. s/ O/ m% ?' n) I# d1 b实例:' i* j( T `& F' s5 g- U0 Z
%对D盘下面的bmp图的文件名进行排序6 a+ G0 w' N0 B; J, ^+ P+ @
clear
F) d% k4 I: w; \( v8 t( ldirpath='d:\'; %路径
! f5 i9 V$ P$ H, mextname='bmp'; %扩展名
2 T( w1 z/ V+ \2 v
9 d, N& Q% _ Mif dirpath(end)~='\' %如果路径后面没有加\,添加2 C I8 p6 {( A9 i4 K) W
dirpath=[dirpath,'\'];" A% \( G8 u3 y. Q1 o
end- G9 i5 c0 S" v3 S' C8 w
" a( I: ]. m* f* u1 ], \+ ^%先取出目录下的文件信息! V$ l8 t( O1 R+ f% N
pic=dir([dirpath,'*.',extname]);$ d5 N/ X% K) b
filename=str2mat(pic.name); %取得文件名+ b) }0 l0 Y! v
* x0 S/ B$ P1 T%调用函数$ \5 i( ?% ?! l$ g% c1 {
sortfile=LengthSortStr(filename)& a% M& b, S& @: \1 x+ L
复制代码
. M# y6 C- t% ^6 b5 [ o" I) C9 m
# D8 `) J" o' ^& y& d- P! A5 \ [. N- h W
|
zan
|