- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
w/ p: l8 C2 B) R; T# e$ t3 L) i手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是$ l' k! x) V; _- I, n& ?7 ~
1.jpg
O( \5 s! Y" n( `9 B1 m+ s10.jpg- j- e& d) ^$ p0 f& S( ^' O
100.jpg2 f$ l4 `9 i* S7 G! C% V
101.jpg
8 N3 ]* T% V9 c' q% R" t) S就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。; j0 s+ Z# B/ t: K; [2 g6 _1 s) _- x
, b$ O# i8 @9 m. W6 p. v
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
- Q2 a( U1 `( a9 p( u# q3 _ q当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。7 g0 N I* a0 o8 M/ r5 a. W
如果不是上面两种情况的话,本文就是实现从小到大排序。+ d+ q1 h j8 _5 t
$ Q" m& d9 Y" v( C" f1 d6 q8 x8 w( s6 Y% A! W
提示1:文件名的获取
+ i( |5 t$ ]# _通过dir可以得到目录下的文件名,比如:& c" q1 P5 q2 L# x) U
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
6 r9 P C7 }7 E$ P8 R2 o4 _filename=str2mat(jpgfile.name); 5 x ^* N1 E+ Y$ e5 a+ t
: C3 t0 G: w# }+ q# }# p4 [! V提示2:字符串数组
7 w. r6 A2 D' L `; w4 B( ^" W) G* E先试一下:2 j9 m: P; |% Q
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同* {3 f3 e$ ?% R% O# d3 i6 |* K$ v' L
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
! ^( x' q' w1 ustr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。2 V' y M" x; ]% X# N, x
8 I7 d5 h1 C% T7 Z8 F! @
这样就导致上面得到的filename每行的长度都相同。* k9 b4 p* f9 g- k
8 K/ p2 y* W9 s5 T9 v4 L$ S0 C
) |, n5 I: t. h% l; b, F- c8 s0 U本文原理:
2 D0 v& E! i# [& z) ]先判断每行最后面有多少个空格,' {: l+ x! Q& j+ T% Z- W6 u0 w/ j
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串1 a8 x' R. z9 N3 z& C% D# g- r
这样排序就可以实现上述的文件名排序功能。2 M) G; d( \" {$ A
) _; ?2 {6 R1 c6 ~8 J+ |- c
6 D2 `+ n0 }5 N* o T
本文代码:
) y, A; e! j1 m3 t$ U& K) ufunction varargout=LengthSortStr(str)4 t$ s! W* S9 r0 x/ U1 D3 n: h
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 T, b4 B$ F+ R4 k( n0 @; a%Argment: str文件名组成的字符串数组* |" H" _/ S% ?# f& q0 n. {
% : 输出参数同sort函数8 v2 a/ ^3 |1 v' s# H3 x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' K5 X5 h2 ~2 t) w& j* rch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好! |6 Q* ~- B% S3 T6 Q' C- T
5 a3 N, \' K7 w5 u' y9 ~ h[N,MAXLEN]=size(str); %个数以及每行的长度
F4 d @% e, W3 L$ r1 pnewname=[''];
8 z+ y$ A) M5 k R5 E* ]7 w5 n! A5 M" D2 B$ v9 f
for i=1:N
0 ^# _8 E9 v' `. f$ h" b BlackSpace=0;! _* S! y# a8 ^2 \2 j
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格 s% A9 d4 f. b/ q4 r
BlackSpace=BlackSpace+1;
$ k. o" T9 j/ k5 O o8 r end' B0 {' y9 I! j3 i0 r5 {% Z& q. O
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
5 m9 s* c" u& y$ d3 s& ?5 G( L' I" [5 [ newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
$ ~, s. v% l1 k4 u* C" Hend/ y& M) F8 \: W
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
+ Y9 P! L4 ]- Q. ysortstr=str(order, ; %由这个序号生成原始的排序名: A2 K1 \ T7 `
2 [% U" k' ^ |2 v9 T1 {if nargout<=1
0 Y. Q" n' @- M/ e5 \1 m varargout{1}=sortstr;) D# X. E. G+ @, B
elseif nargout==2
3 ] g+ }- L* g: [ K( }- I varargout{1}=sortstr;) \- X* m& Y: h/ N. d$ W' @* s; U
varargout{2}=order;
" f) n1 ^ k4 C" W# [8 Rend
! O( \) J% w9 d复制代码
$ T/ r5 l& T* Z9 h* s R实例:6 N; l* f( c& A, F
%对D盘下面的bmp图的文件名进行排序 C5 v( a+ o+ f% P' S
clear! t" c7 V- @" h8 X6 P4 L
dirpath='d:\'; %路径' `8 ]/ G2 I0 @' `% _6 W) D. w
extname='bmp'; %扩展名
7 z: C8 u& O( J$ h9 h) y0 }+ n8 a: O; o' B% i
if dirpath(end)~='\' %如果路径后面没有加\,添加
$ a- R" b$ I/ X; q* g! F dirpath=[dirpath,'\'];
( ^$ x D3 G- }end
: {. C6 R+ _" f9 I# E6 N3 R( J( f4 q/ ~5 X/ o& {9 H
%先取出目录下的文件信息5 S1 _. x9 W& m3 A8 B9 x
pic=dir([dirpath,'*.',extname]);) J8 b% x' d1 ~
filename=str2mat(pic.name); %取得文件名
% _" h5 u, q* M: T! y* k
! k1 h8 c- O/ T5 A% r5 C%调用函数
# `/ t9 B5 W3 y+ k- gsortfile=LengthSortStr(filename)+ L6 o( v6 C% x9 l
复制代码
# q7 y/ X+ Q; v1 M. J
* Q8 O2 W; ] _5 x' c+ N, Y- I5 i/ e5 O. Z% R0 E7 d; K
|
zan
|