- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:& `" p% k) e( }' M9 J! N! e
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
9 C5 e& }4 i2 Y( ?9 [1.jpg
9 t' m! W$ F4 z7 U& {) T: Y8 {10.jpg
' U: [3 @6 a# ]& ?) V100.jpg# T; j( m/ D* v1 C# _ j
101.jpg! c- D e# p& w2 r9 i0 x
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。. z4 ?9 x1 T4 R4 j
, p. ^# ~$ @4 n: n B. R- [4 V当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
1 H1 Y7 j* e) s$ I, i/ @当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
- Q% ^( U( i/ M0 [; o' p如果不是上面两种情况的话,本文就是实现从小到大排序。
' z+ z& S, N* G& S! i
; Y* ~( A& j7 @5 M
8 h- m$ _# b2 t* ?提示1:文件名的获取. l4 x$ ^7 w+ L2 I; X! y5 l7 \
通过dir可以得到目录下的文件名,比如:. @+ y3 |( S- ]8 J1 g' h
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。; \4 S! B( ~0 m9 e- v/ E4 z% f
filename=str2mat(jpgfile.name);
! `7 f& ]$ l* v1 ?
# s. N2 e& b: M提示2:字符串数组+ ^3 O+ b* X+ O3 R) Z
先试一下:
~ }5 L8 z% D; y8 h3 f8 Cstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同2 d. }& z! M6 |6 s$ s8 ~, l
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同& E7 D7 N5 M, o; I1 k# d/ y2 c2 s
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。, ]. F7 z( s1 [4 v
6 @. Y, Z2 g9 a2 c- D3 k
这样就导致上面得到的filename每行的长度都相同。+ G. G6 F8 ?- k' b+ Q) p
1 E) U: D, m0 @
$ N' p7 f/ X) j1 j4 j8 a本文原理:. C# Y% m5 [0 m$ i _
先判断每行最后面有多少个空格,
5 T& b( a2 ~, L [然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
$ a' [& w$ t6 _: m& P* A这样排序就可以实现上述的文件名排序功能。
' \! J; _% K$ o: j
; n- |$ u1 {4 p, n' R6 \- L# ~' X/ f( k4 I
本文代码:
& m1 F, x' D3 V0 yfunction varargout=LengthSortStr(str)
8 N6 Y5 a$ e& U. G. X5 e- Z6 O' ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; o/ R) h, ^# v
%Argment: str文件名组成的字符串数组2 y, h6 \- U F& u$ i8 f
% : 输出参数同sort函数* H+ i$ T3 C, H t8 P* M7 |' e7 d. D: m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: q; N4 a% |' T9 b* l* z
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好2 j: B! ^5 q- @$ b% B0 K
" R8 {$ S) a, v[N,MAXLEN]=size(str); %个数以及每行的长度
+ U$ S; ?& w: G) T6 ~newname=[''];
& `& K% u2 A, N5 \5 L9 I
7 Y: O1 @' q' I1 N3 r9 I! T$ V9 tfor i=1:N& T4 E7 q5 h1 x/ l
BlackSpace=0;
; E8 B8 [6 p8 x& j0 } while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格3 C8 E X1 Y5 c
BlackSpace=BlackSpace+1;
- [: B- N8 l6 N1 y5 F, L* W0 ~ end) j% H: y' }" {2 f) c
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格0 t3 _# q: i7 [7 P6 Y" {. f& n
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];0 {4 w$ D" \8 U7 \
end! J7 A' i( i5 @! r
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
5 @* b M* [! a, k, csortstr=str(order, ; %由这个序号生成原始的排序名
1 W3 |1 |1 j2 ^, y8 D% u2 J
) f7 a3 e$ m/ V2 }; fif nargout<=1, I% W B1 W$ G+ I. |5 X; Y' q( Z
varargout{1}=sortstr;: v7 _ g7 W. P& b9 T9 z
elseif nargout==2
9 R9 o% D% R+ @% P) } varargout{1}=sortstr;
% Q7 n% G: }9 ]+ |( } varargout{2}=order;" ~- u* p5 U* H6 |9 q
end' N( Q! P9 [! N% U
复制代码) _# w p& R6 ]' q, `4 [- I: r* N
实例:. t' m {" [& S, ^. K+ {* Z
%对D盘下面的bmp图的文件名进行排序4 _3 R1 r: [0 {0 o/ G% b& s, C
clear
( V& y4 {( S( }7 I) ddirpath='d:\'; %路径' Z6 S0 o$ h) B! \
extname='bmp'; %扩展名! F) Z" l* a+ ~, ?2 [4 x2 R
1 x+ x2 n/ U4 ?! r
if dirpath(end)~='\' %如果路径后面没有加\,添加
; n, [* {# u+ g- z2 V/ P/ j: S" E dirpath=[dirpath,'\'];3 w1 r* ^& K) r7 ]+ [# [
end
' I' R$ F, E& A; U, u: K% w& t% O) Q
8 [0 f; l1 f) _' ^%先取出目录下的文件信息
, e6 |$ c, Z) p3 L0 t) ?) Spic=dir([dirpath,'*.',extname]);
; V" O5 v/ @" W/ q9 Y7 P# efilename=str2mat(pic.name); %取得文件名
' _6 v( t! }( V' j4 n+ v+ t+ ^
$ M! m, P, b) j%调用函数' ^& m! \% G3 p9 H( j
sortfile=LengthSortStr(filename)
8 K8 ]6 c% ^: _0 T- S2 P, L复制代码
3 a( `1 z. t! s: ]3 ~1 {3 }8 e+ w. V ?9 e: R( }# t
1 [/ ^. [. c C: C% r1 a: l- s4 s
|
zan
|