- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
) P+ D+ ^9 q! z8 f! h5 G% z" |手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是' v" }0 S. v. U
1.jpg8 ~7 i4 F8 Y7 n3 }/ P
10.jpg
) Q0 ~( k2 b! l' Z! R100.jpg
- ?( c6 j; E* g8 d101.jpg
7 Q9 Y4 v3 V( c4 L* U) I就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。- ]7 i/ G: _0 L' z6 y; D
8 y, w# T5 K' v j, J; e6 V当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。1 J; u( w4 C! ?
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
4 o, T" ?9 M: E% M. l如果不是上面两种情况的话,本文就是实现从小到大排序。
' }6 ^$ C' w% k' @# _ H- B, E! a& G& z! L" m
; ~5 [- i6 Y! h8 z+ i
提示1:文件名的获取& g& V1 B% ?4 _! K; |
通过dir可以得到目录下的文件名,比如:
3 y" Z. R5 N4 \4 u4 }9 s7 A ^& Kjpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
+ o/ `% n5 U/ wfilename=str2mat(jpgfile.name); 7 t5 p( O6 s' Y3 m, [
" r; ` O0 v. @1 P提示2:字符串数组6 s$ `' c) O) m2 N7 z" u
先试一下:
5 s! H" D' y( [' Istr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
, }+ E3 M7 I+ G2 x5 L0 Qstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
& U2 {6 q2 `7 M4 y7 Z- E% @8 l9 @$ Rstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。8 |* t4 n0 o% Q& `# i6 b. B+ u
1 [% J* J+ [$ I
这样就导致上面得到的filename每行的长度都相同。
+ l* q; K: p4 B$ _) |- F( F/ G) a( g; q
# G1 W+ U1 B6 p0 X
本文原理:
% y( |: H: b- t1 ~4 _: y5 u先判断每行最后面有多少个空格,8 q- E m1 r3 W4 n8 i+ Z7 {
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串% ?2 C+ r5 r5 _$ N
这样排序就可以实现上述的文件名排序功能。
3 {8 {/ q$ a) Z# G
_: F% |" [4 {$ Q* X# F, j, C( E; Y6 s" j' J0 k
本文代码:6 ^: a- N/ Q. m! S( R
function varargout=LengthSortStr(str). v2 M8 y: S. A0 ?. H2 Y+ F3 h8 o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! j0 T% b$ x& t7 R6 L: x%Argment: str文件名组成的字符串数组
; `: x3 v% K& A" d3 t4 U% : 输出参数同sort函数# e. e3 p8 {& e9 F3 X3 i2 N
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& l. ?, o9 G8 O! e. D6 f% _2 a
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好8 \7 s4 h) c$ g q9 {5 R7 g$ S9 O
' ?$ t4 R* n! D: _- y[N,MAXLEN]=size(str); %个数以及每行的长度
) q( p+ n' y% \newname=[''];2 s$ v- K, H: M$ c2 b; h2 H* K
: U4 H2 p. W% a4 u& `for i=1:N
; s4 i: O Y; L' m, b7 A7 ]5 | BlackSpace=0; s) U8 E& V0 I3 U. v
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格8 c, X: J; N/ W; R! e
BlackSpace=BlackSpace+1;
* R# L9 ]3 _$ e/ a8 T( S( r end
) Z) `, H' U2 f %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
% X" X, e6 X& y. s% ?/ P. H newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];4 H. s! _- q0 z# r9 i* H9 o B+ y
end
, e/ c5 {1 t0 x! G: N; H[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号1 h: @3 e/ k3 ]" f1 |
sortstr=str(order, ; %由这个序号生成原始的排序名: H4 M# H7 y: N2 {$ Q
6 _/ O1 a; R1 X. R. Q" G8 e8 fif nargout<=1
9 t8 @$ x" l2 @8 K F1 k5 S varargout{1}=sortstr;- H$ `2 [+ h* e, T* M8 W
elseif nargout==2
( L9 T! ^, D! X5 j8 C varargout{1}=sortstr;6 Z4 X9 \$ A; z) J! u3 ^: c
varargout{2}=order;
5 u/ E& p# F y2 ]" `7 v* jend
0 y. W# T" L( n复制代码- F! T$ r' T/ T: C
实例:: V: d! n0 \" m' a
%对D盘下面的bmp图的文件名进行排序2 s ^+ k$ p( a; x& Q
clear
; `! y; m- x: H! Y) [dirpath='d:\'; %路径4 f) N3 j% c/ r8 k' w% \
extname='bmp'; %扩展名
, L1 t/ n [$ N9 U j, x3 p" Z7 {
if dirpath(end)~='\' %如果路径后面没有加\,添加
* b s5 s" l# z$ ^! Q1 V; i dirpath=[dirpath,'\'];% a6 y+ X+ q- \9 V( C B
end+ W: ]/ N# X4 Y5 c
4 a9 a7 x6 p k3 `( \7 F6 G
%先取出目录下的文件信息
x" u: X5 b0 [$ Zpic=dir([dirpath,'*.',extname]);* m; [/ z& \; Y3 x- X/ \1 X* y/ s# j
filename=str2mat(pic.name); %取得文件名2 w, `$ D% L# p/ d1 x2 K
' l6 {/ \7 F6 n' o3 p%调用函数
( y H0 x! I0 S. D0 dsortfile=LengthSortStr(filename)
6 W0 P8 [' U, I1 }复制代码' S# O1 l* `6 Y" W
. r) X3 C4 W, Z1 z+ ?
7 n( A" D6 N: {8 f) ^6 A( [9 y) E
|
zan
|