- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:. M. S0 _+ E0 k0 a( B
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
5 x# k: w. S6 z% w" Q; j1.jpg
E: ^; u( r, ?' q, v7 E10.jpg5 ]; D$ w5 g0 R* c& U3 |# k6 @7 E
100.jpg5 N$ ]7 K1 S( K; d+ \5 u
101.jpg7 I% c/ T+ y) R$ K, t
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。0 t: F2 v4 t ]3 p+ a# F$ w" g- A. Z
- p2 t/ K( h, j+ s6 n D
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
0 p) p8 E5 ? I- }$ U* c1 }, ^当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。/ `* |, I9 Y) S; s* P/ A
如果不是上面两种情况的话,本文就是实现从小到大排序。
5 _% Z) e' d. g* K# N0 K# l+ v3 _; O+ z5 K; w9 u" `
! _( u! O' M+ e* V
提示1:文件名的获取
' D3 ?* u# U+ i2 b+ e4 E通过dir可以得到目录下的文件名,比如:) Q+ k5 {9 _/ G5 t: l
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。7 r: o- Q: \1 x& f3 m0 ~: j
filename=str2mat(jpgfile.name); 9 Y% F' a$ i$ C$ ^
/ _% v2 t+ a3 k2 ]" U提示2:字符串数组
1 R; C1 s( ?# h* }: g先试一下:
X8 p5 r, |% ?5 E8 ]# `str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
) j0 O* S8 D) r: A, ~ [2 u7 Cstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同. k5 K3 H) H. m. }! F
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。
) P1 f/ A0 o2 K% y/ F: q9 h7 J9 j9 V" \. T
这样就导致上面得到的filename每行的长度都相同。
6 e) P" o, |$ I( ?: o" k( K/ k( M5 ^2 X, P) Q; w' Q3 z: e
. N" h6 C; H* @) y' l7 k. r2 g
本文原理:% e) K; y' E# Z( o0 {3 x
先判断每行最后面有多少个空格,
6 c9 v0 b. I# i$ G$ h0 v然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串, u; s/ n: ?2 @, i% N
这样排序就可以实现上述的文件名排序功能。
1 H9 G5 }; s. J8 ^5 y; M& ? T- a T9 z4 k8 l, V4 j" K
9 Z; i+ u" F) N本文代码:. v, j4 @% v0 m0 t* G0 t* i
function varargout=LengthSortStr(str)+ X2 m4 e3 y! z6 G9 E8 o8 }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- L: t0 u% ]+ ?% ~8 q) v%Argment: str文件名组成的字符串数组6 q' }6 @/ e' O% q! ^- {( b2 |8 D, }
% : 输出参数同sort函数4 F5 r `& r8 @ U+ @& m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% O! Z; M& {" @! y* G ]
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
5 ]4 I: g( Z5 y; W% w0 o1 B# Y
6 K, X$ ]" Y' |3 Q[N,MAXLEN]=size(str); %个数以及每行的长度4 X7 E" S; M: _& l) g% j1 S6 I% L
newname=[''];
, Y6 y$ \& R& [ g5 z8 t9 c! Z* B4 W z0 }6 n
for i=1:N! M8 f/ M# ~& O0 G8 d+ o
BlackSpace=0;
3 l, r9 B/ u2 m s while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
. Q6 U$ O' i* @" s BlackSpace=BlackSpace+1;
* `$ N7 Q; E! _4 H4 h! k) A end
0 V5 H2 h& u/ G8 A: g7 b7 a %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格# Q' W$ \- M9 t, ~$ R+ U
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
" e W. q$ R+ O2 |1 w" f+ B+ rend% ^3 y/ S; Z" t: T0 {
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号. c, |8 u# Q) c$ A3 f# y& j
sortstr=str(order, ; %由这个序号生成原始的排序名
0 A' Z1 y1 l, N. @/ k- a8 }- G. f4 C: c) d
if nargout<=1
$ a, @* g+ Z* a# t" q8 y varargout{1}=sortstr;2 c# n- ]; L% E
elseif nargout==2
0 m, }, J/ S1 p# T, u varargout{1}=sortstr;3 `+ c5 G/ S/ P! a9 X$ z6 C
varargout{2}=order;8 c3 w) Q( e7 `7 X
end
# ]3 _9 f* z) A t- y复制代码
- Q" f3 G$ L+ F8 N实例:% B/ Y! |) k# C: s: n* j
%对D盘下面的bmp图的文件名进行排序* A: X r' a+ b$ }% i. y& s
clear
3 N7 n- c8 o" mdirpath='d:\'; %路径; v/ V/ w. P9 B9 R$ s9 ]- o
extname='bmp'; %扩展名
$ {2 z7 ?( ~7 H& C- l. j9 }" h }, y9 g4 q0 i/ S1 U+ T
if dirpath(end)~='\' %如果路径后面没有加\,添加
( g! x& P. Y& m. d0 h dirpath=[dirpath,'\'];) n9 {, S- o+ M( s
end& z0 H( |; _3 ^0 n) A
5 K+ Y2 G: b1 r- q+ \( ~%先取出目录下的文件信息% t5 A) k* N, i' {/ T) A5 b2 V. _+ p
pic=dir([dirpath,'*.',extname]);+ J l* p, e" `6 W: a
filename=str2mat(pic.name); %取得文件名, ^1 M; O% j" N" ]$ {9 ~
2 r& _) w, u5 t' L1 r& @) ^
%调用函数" I" i& z9 }; Q! m
sortfile=LengthSortStr(filename)& ]7 J9 G/ g* c& c
复制代码& c4 u- s$ z1 D8 P
/ `! f) a7 @ D; ^, U( n; R0 ]8 y, R- W1 v: E" {
|
zan
|