- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:( Y, [9 A2 x# D- h. j
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
/ w, g- W1 C0 W! g9 ]1.jpg
' ^5 s$ x& \ `/ M$ t10.jpg! L! k) Z1 H7 |4 J- E
100.jpg! j, d# @ N+ k- h
101.jpg6 i- [8 X$ i' I1 v* a+ E2 s5 P( r1 {
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
2 }0 C' y' y. D' k8 Z9 x m1 V, m t& I( _5 F# Y7 _8 D
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
/ n4 M( R2 E# J+ o当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
: S6 R/ O$ v& E, I e+ T6 T如果不是上面两种情况的话,本文就是实现从小到大排序。
7 }; i. }) r- _. p$ M
% e0 C7 x# ^2 T* ~, R
9 t+ s) `1 [9 p% V提示1:文件名的获取
& ?9 y' y3 O5 H; H% W- V通过dir可以得到目录下的文件名,比如:$ U* K# Y6 c6 j
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
/ x& e. \) g# n8 ufilename=str2mat(jpgfile.name);
/ N$ ]* b. m: X6 a0 G
9 F( L& O: r1 K3 g- C8 W提示2:字符串数组
0 ~3 @; [/ e) J1 i9 A先试一下:0 X4 Q `4 k2 c$ P Q* _. [
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同. K8 u I* b; E5 L) u# j }6 X
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同' V( n* r5 q9 L: p! P$ F
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
8 Q* ]+ t7 E+ h4 b3 l
Z- U+ y8 ^0 H/ i2 Q这样就导致上面得到的filename每行的长度都相同。
4 S' ?% x3 Q9 _8 a% u# K
8 W, N4 [8 r5 v: D0 K( D- [! Q; @2 ~. N: B( S% Q
本文原理:- v2 E2 o5 Y1 K1 r" n
先判断每行最后面有多少个空格,
( Z4 m) Q2 e5 n) P6 C) [' C6 C然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
2 _8 J" G L: g: U% a4 W这样排序就可以实现上述的文件名排序功能。
- z$ r. L: J" @8 ?0 g( Q$ _! M$ o- f3 \ f" ]/ o; h8 P- P
3 [2 ]2 a" W% _/ d# P1 I本文代码:5 C' g$ l6 {# ?7 @- F+ g
function varargout=LengthSortStr(str): Y7 N0 H- M( B) K
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- |' W5 |7 l7 d! I" |/ r" T%Argment: str文件名组成的字符串数组
* B$ Z( s$ Y( _0 D% : 输出参数同sort函数% e! h0 j7 O, n
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
V5 A z# Z: }7 t% L$ ~; a! uch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
2 T: v' }+ Z5 p: m4 _$ H9 `- S7 g+ f5 |) b. e: o( Y
[N,MAXLEN]=size(str); %个数以及每行的长度; B2 D* [5 x3 o1 r
newname=[''];. G% } v6 u* y+ @. U/ f& r9 A4 _
! ^" A+ O6 |1 G, i( Tfor i=1:N
0 g( P& ^' T2 [& C BlackSpace=0;, a3 G) B3 w5 q' @
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
( o4 ~ F/ d9 o BlackSpace=BlackSpace+1;. S5 Z3 y2 Q1 o1 Q6 ^
end" R! \2 [+ b3 C- a
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
, D+ \9 {' v% t1 ^1 N newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
2 t5 F+ J9 @' z, t, V% Dend
3 _" l% \5 `: V3 p) j) ~5 n[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
# L. R" y1 E1 O8 N6 N7 csortstr=str(order, ; %由这个序号生成原始的排序名
* [! _' r0 h! D/ D& B, W1 G9 @! S6 w0 o1 M
if nargout<=17 u& h1 }! x d
varargout{1}=sortstr;( s- ^6 C0 b9 o! X* `0 a
elseif nargout==2
$ K( J& h" N' V' V7 H8 O( i varargout{1}=sortstr;2 c9 ~' t3 ~. T
varargout{2}=order;2 h3 S. u& x# ~2 N
end, S- I( i' g' z% u
复制代码* I i6 J1 B2 G& t( q2 J
实例:- d) [3 q5 f( N+ J1 ^
%对D盘下面的bmp图的文件名进行排序
4 @ M) r% O+ c/ h& F+ K wclear
( \9 g% ~. C2 t/ F5 U& u1 @0 ]dirpath='d:\'; %路径0 x5 b4 r, A/ }. T: @* q$ y# I
extname='bmp'; %扩展名
4 h1 v! h1 |* M+ @6 [; @$ ~( R8 O( Z
if dirpath(end)~='\' %如果路径后面没有加\,添加
3 p9 ^1 S& ?0 S5 X1 I# u dirpath=[dirpath,'\'];7 g) n# X3 r, G% o0 F) K
end# i" ?4 N/ v* D! Z: z' R
6 I |* A" ^& M; U) s* ]%先取出目录下的文件信息2 [5 h! I+ t, |# _6 S) v& M- L
pic=dir([dirpath,'*.',extname]);
% }; }' A7 w/ v" ~! Hfilename=str2mat(pic.name); %取得文件名3 F8 u/ }5 c7 d; z4 A/ C
2 w& D$ _# |7 J4 Y5 |%调用函数. p3 P2 w* k; b
sortfile=LengthSortStr(filename)
/ \: D) H/ V3 T$ d6 y7 n9 I复制代码3 i: h, ?9 r0 T
8 |7 h3 e3 }% I$ N
8 l$ _, D; d" O% K* `" D$ l |
zan
|