- 在线时间
- 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- }- P) k" r
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
" U, k' n! `8 S% ^8 n+ J6 i1.jpg
) F/ R( B5 w& z& i( F10.jpg' N9 s; h! r6 V$ _
100.jpg
; K* D1 t9 a) z101.jpg( d$ d' j; S f, y( ~7 ]1 L. S
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。& l! I' R, v( ^1 ^( g% z( d- }
& D* f- w! u: o+ V, ^
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。, b3 w1 [" R. [, j) F' ~
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。# ?7 y7 a) E) i; J+ ?
如果不是上面两种情况的话,本文就是实现从小到大排序。
& a+ z; C @) E2 `* [7 X: U2 v4 S3 D( m$ l& v' \7 n+ O+ ~
: s0 }8 @ m! C, v) T ~! s3 j7 E
提示1:文件名的获取7 p$ L) |: K( Y) Q( i9 J/ D7 Y8 X
通过dir可以得到目录下的文件名,比如:
" s" W- f. Q0 F: j& Sjpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
2 X1 E/ u _. wfilename=str2mat(jpgfile.name); : L8 O+ U' C h* M* o3 A9 l
9 q) e) [) S- h$ q8 b提示2:字符串数组
* j! [9 l( R# ?3 ~先试一下:& F( K/ C" v- P1 x
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
7 h+ o/ N0 u/ B" gstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同: l$ o' y0 m% x% X$ w+ T( `& b
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。/ L( g* {. r) q& x2 j5 m* _
t% g) U. ]2 v4 j2 O, G这样就导致上面得到的filename每行的长度都相同。- o, I- N; I/ @* j- b K
0 X" h) v3 f0 A
' y( S O! h9 c& S' t0 w v
本文原理:
4 v m# q9 G( ~- r先判断每行最后面有多少个空格,
1 H# X8 W; B+ K! U) E k然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串! i/ q) J' A% X9 a- e
这样排序就可以实现上述的文件名排序功能。9 P2 t7 r; y0 i, J$ ~! r
% c7 o' [+ B1 G" ~' I
5 D& k3 b$ |( \0 W; c9 p
本文代码:
( Z( G& Y% b0 h% O! s: dfunction varargout=LengthSortStr(str)
5 G% N- I- j* F, K L. K%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. u: R6 a% X7 M8 B9 u$ i5 l%Argment: str文件名组成的字符串数组
3 I: u) {2 s9 I9 n1 V% : 输出参数同sort函数
& i Y0 X5 X8 d- \7 w%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: P1 \- @/ k3 v4 a* z \
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好- K9 F' D6 @) x
( F" e. q; ]5 Q8 l7 q0 E$ A2 C4 R
[N,MAXLEN]=size(str); %个数以及每行的长度+ P0 N7 X4 R( p3 \. W, ?
newname=[''];4 W: @% Q/ S8 Q7 N6 k
5 t( u& T- e1 k: Y+ O# P+ Z& v' S
for i=1:N+ _- o; U7 _% j- v9 K2 I
BlackSpace=0;
" ?; M/ ~! c) v! l while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
& L9 C' M3 E* }# B$ l BlackSpace=BlackSpace+1;' V; M m6 p$ d% f5 [" z: ]: z
end
* H+ a' X% H4 z. ?! F* \) ~ %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格$ a9 Q2 _3 q2 s: n0 ^7 W8 t
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
1 O2 N' G2 }! O U& ?end% E9 R+ G$ @7 `6 c- x0 `
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号/ F" N' e2 D7 `: K- N/ h
sortstr=str(order, ; %由这个序号生成原始的排序名! J8 m1 Z; j- F- q1 D
/ R4 t, ]& \9 U1 t4 ?if nargout<=1 }2 Q2 B5 g2 a6 z* {: [) X% K6 H7 r
varargout{1}=sortstr;
7 ]0 |3 D4 I6 L2 N4 O# x8 eelseif nargout==2
# ~$ m3 i: w. C% e varargout{1}=sortstr;
) u# E/ Q9 j# V4 L varargout{2}=order;
8 T! m% l& h* oend
2 B! D, E2 |/ p4 j复制代码' V% L: u/ }/ F' W
实例:' O' R& i" h2 y1 \4 _3 N
%对D盘下面的bmp图的文件名进行排序
: f7 z3 N* Q% `/ o1 }clear0 p- m& P2 Z7 Z" `+ J7 ?3 Y) F3 L; y) d
dirpath='d:\'; %路径
% c& y, l9 U; oextname='bmp'; %扩展名9 p' g* y2 X5 b; ~- H; H7 _
6 O3 c9 C" W- g' N- |
if dirpath(end)~='\' %如果路径后面没有加\,添加+ E- i& P9 w9 Y+ k( L7 ]3 l
dirpath=[dirpath,'\'];
2 [1 j; M. v) I- `2 tend1 j/ Y4 Q7 g- @! a" S5 R- l6 [
1 S6 m$ q% P! p
%先取出目录下的文件信息8 s* f* d4 ^' e2 q, n
pic=dir([dirpath,'*.',extname]);# `* w# b8 J' i, W: d0 ]
filename=str2mat(pic.name); %取得文件名5 z% X; E/ b' y
7 |2 u! ^; e- @& Q% E) I( ~%调用函数
: x' _( W! @9 @0 Ysortfile=LengthSortStr(filename)1 d; y+ Z6 ?: }+ c! e
复制代码5 X! g1 H Z% T* o5 c2 W
% J9 B5 T5 B- y
: G1 T" W8 O) B% G |
zan
|