- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
* U" r: g* p! F手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
. N% z% {' F" `9 |- {. S1.jpg: t& A6 J6 F: F( T
10.jpg
7 p5 C2 n$ y) }5 u$ G1 U$ Q/ X1 L" C( v100.jpg8 E- F$ \4 \) {
101.jpg% p* v& ~% s5 {/ g- i; x6 J
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
9 L& m$ {/ j+ c0 o
% I2 }6 L0 t E4 ]. @( q5 ?当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
2 j3 \2 J% x: l6 N2 o' V8 N当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# w7 H' A, Y0 b$ N5 ?, i6 j# u" E2 o
如果不是上面两种情况的话,本文就是实现从小到大排序。
2 \- I/ f: R* O+ e( F+ |/ O2 y# U" s D- m$ U( a# L! Q
2 E( B! g5 p; L2 X, Q" ^提示1:文件名的获取
9 g3 p6 x, ^/ E/ u. z通过dir可以得到目录下的文件名,比如:+ i# _6 z& U! I
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
) I, H1 _! D( y1 e( Efilename=str2mat(jpgfile.name); $ Y' n/ \1 s* s: {; C
: `3 I+ H+ Q" {# q- N% e( y" n( Z5 ]
提示2:字符串数组
0 C1 O4 ]& _; w& \先试一下:
; g( x Y) p" L8 t; @str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
0 j% D7 W: I8 X9 Istr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同8 V) p0 j; d5 T5 R( ]9 w) X
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
' C: n" n$ i4 i' X' E
1 L* K6 [% B- T; W& N3 w这样就导致上面得到的filename每行的长度都相同。2 d6 e% L& c* i% L
# D3 I, |# f" q8 g3 g- F
+ m; @: V0 a! k: C本文原理:6 s* H% V. e, f9 C9 S
先判断每行最后面有多少个空格,0 y0 G2 X/ X" @) Z7 ?
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串( V7 C8 K5 G& ]! m! s4 U9 ?: @' e
这样排序就可以实现上述的文件名排序功能。
0 _* R6 S: |* q) }4 G' Y5 e- H) k* g0 Q
$ B0 j4 b# G: u+ v本文代码:
/ k. N: j- H& ?, W0 Wfunction varargout=LengthSortStr(str)
5 z) p) I& E P- \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 l( ~2 A3 T" g5 d \%Argment: str文件名组成的字符串数组
5 E! J F- E& `1 N% : 输出参数同sort函数1 B$ M5 o+ ?: R
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 p, D6 K& v- b4 X) k0 o" Pch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
% f O* V, S I$ c8 s9 H3 j @( x
' r5 W! A$ ?- ^4 m' K3 I[N,MAXLEN]=size(str); %个数以及每行的长度# O/ h2 Q. _& ~
newname=[''];9 X5 L4 K4 A1 s3 W1 k8 S. n, [
% e: V# Q; V4 Y# ifor i=1:N
) y! d0 Q0 B( |+ f, ? BlackSpace=0;* J J0 A2 K6 d+ I
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格& Z/ \' ^+ m+ l" ~2 y* ~6 n
BlackSpace=BlackSpace+1;
7 P! o1 M# A- h% ~! i' `: i7 ?+ Y end
% ?/ M1 Y# ?% P' [/ G %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
& D2 N4 M, l# n# D7 q! H newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
$ F3 F& ~, r, ~2 P6 Tend l/ v5 S6 G+ B, Y2 I( ~2 ~1 x6 H$ }
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号* {4 ~2 p$ I8 x5 s3 V4 T8 {
sortstr=str(order, ; %由这个序号生成原始的排序名1 U3 O* y" J: @
9 v8 ~9 a" t' a, i& a
if nargout<=1
5 b& A" y1 F R1 T% n Y2 n! l, h2 q varargout{1}=sortstr;/ d: r) ]6 ~7 [4 W
elseif nargout==2
* {1 S9 r3 ~6 M# v; m varargout{1}=sortstr;4 s% G4 {. x6 O' a
varargout{2}=order;6 N: t) M3 T# ?9 D) C; q7 A& w) j
end
; z, h' {9 v, F复制代码( l. }- g1 ^8 N' H2 B* P% F9 n4 e; ]8 M9 e( e
实例:
1 t) A8 V3 k9 [+ a. r o9 c6 ?%对D盘下面的bmp图的文件名进行排序% a9 c! O7 `1 C' l# P I
clear
5 K! v% I8 H! z1 t t/ a6 q% `7 s4 ?dirpath='d:\'; %路径
w3 \ o- o& n \) x0 S" `extname='bmp'; %扩展名+ Y# j$ w8 i4 k' E
& _" @. t A- V" P; Y; {
if dirpath(end)~='\' %如果路径后面没有加\,添加
! n6 [) L$ N% `0 q9 K, h1 F dirpath=[dirpath,'\'];: N9 P( m+ s E4 |7 Q9 P/ E
end
, \$ {4 w: k, x1 d3 e# O, n( [2 }0 P& S
n6 D7 l* C: d6 s- p' R8 C; o5 b%先取出目录下的文件信息
/ t( {) H& U L& Bpic=dir([dirpath,'*.',extname]); m! @: d4 L. z4 D) C
filename=str2mat(pic.name); %取得文件名/ q+ @/ B2 h& n G% r: n
4 x0 c9 `( e) G R1 k- \- |+ b%调用函数: N2 P$ w# c0 w% B+ O
sortfile=LengthSortStr(filename)( h& u" `1 T/ R
复制代码
+ t8 B, a @3 b0 i8 J4 ]/ r, D" g( n. ]! ?- m. j% i" V
" Y, ~& j4 H" b# ~
|
zan
|