- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
+ V4 A! r H/ s* K2 S% _+ i手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是# @0 c6 K* p* p% Z
1.jpg
9 Y6 `; X# S( i10.jpg5 J* D& j1 o. J2 {6 h6 Y
100.jpg
2 T& s" h) |, ]! N101.jpg
. g& Y7 Y) f- T# M/ G就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。: s5 G1 T" h8 j1 W
2 s2 u' _+ ]* m1 q9 }当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。7 }, R# i) b0 {0 u* q2 H7 w
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
3 t5 x+ i6 w( H8 W \如果不是上面两种情况的话,本文就是实现从小到大排序。
- ^2 L; I- c5 z, }8 C9 A2 W) C6 S0 q1 t* O1 f* y( w
3 x+ l$ _8 t! }! Q, O9 o ?: |8 n提示1:文件名的获取( h" G8 @; o* ~! [# K+ L- k
通过dir可以得到目录下的文件名,比如:
' J! }- g# e7 K% Y& i: ~jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。4 |( A9 h- M5 Q5 k* X. m: U2 q
filename=str2mat(jpgfile.name);
; n z( K! a# P9 I
* U$ C; o1 k7 Z" y7 i6 {+ P% m7 ]2 C提示2:字符串数组$ O, ]0 a: X7 d9 E4 R: R
先试一下:/ t/ P) |! c$ W3 a: @0 }( K
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同5 x6 ?$ s7 @$ U6 T6 d Z7 W5 ~4 Z
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同2 X; Q8 n7 u5 _/ \" i
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。; W+ W% A" w4 R, ?, c
% l1 J1 G0 E% {+ J这样就导致上面得到的filename每行的长度都相同。
6 g8 g; Z4 v" Z
/ A) e* [+ y: [5 ^* q' @: u. l( p$ s; Y
本文原理:
1 j, x; O Z/ b先判断每行最后面有多少个空格,- n4 T F: R7 \6 A/ O
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串7 q" V0 w. N6 m' H0 J: C
这样排序就可以实现上述的文件名排序功能。2 W( ^4 \% m; u9 R
5 m( [# `0 b1 ?/ h5 V( _
, r& l: n' S' D h/ {5 Y本文代码:1 [% [% n/ A8 `3 Y1 M
function varargout=LengthSortStr(str)
4 P2 j( |- J5 V- ]. W8 ]%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% V g! v! f( y* ~, |$ u
%Argment: str文件名组成的字符串数组( R+ B+ _# x4 J8 r4 w3 M
% : 输出参数同sort函数+ q3 z0 K6 B g" b# |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* v: @$ W* O' W- |, D2 C# R' b) Vch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好6 F" S5 j& L& L
+ Z: D( K/ n- _8 M Y[N,MAXLEN]=size(str); %个数以及每行的长度1 y! _' d& Y0 }
newname=[''];1 ]& k) \5 }2 w& O
" G% n3 [; o5 X$ D
for i=1:N
3 q- k1 h2 O6 Z9 w% O BlackSpace=0;
5 Y, S7 M4 M* ]; O while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
! a/ I) A) W) ~ BlackSpace=BlackSpace+1;+ q$ }0 F# ^1 D0 Q9 j5 ~ ~
end/ b- R O% R- M1 W% I/ r$ i* W4 S2 `
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
+ y0 O, q4 Q5 J# o! ] newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];# B) e9 L8 i- h3 |5 C) s5 d
end
+ F. D1 o! W- `8 \[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号& d+ C, M' }3 i. v
sortstr=str(order, ; %由这个序号生成原始的排序名
5 O: W0 s* S+ ~* A) W4 P6 N4 T+ `% L) q* I
if nargout<=1* k4 q5 _5 { g% k' Z
varargout{1}=sortstr;2 W8 w: Z( ^3 q9 l, T
elseif nargout==20 r% G* |# | R _) ~
varargout{1}=sortstr;
7 V1 y+ a, \. ` varargout{2}=order;
: }4 y, d/ C$ K/ u9 G3 {end4 Q& b4 H. F" \! @* N
复制代码; I. j7 l: ~! y3 Q ?! I
实例:# A2 N8 i% d$ `* l( J* p
%对D盘下面的bmp图的文件名进行排序
/ e7 Y, i$ i5 s; \0 Q- x# m2 Iclear0 s% p/ S3 `* G
dirpath='d:\'; %路径
$ A" i" q$ `8 rextname='bmp'; %扩展名 p, \( w/ ^7 o" u; i( o
: c" Z2 s' n9 H+ h0 k3 E/ } d0 n% u4 a
if dirpath(end)~='\' %如果路径后面没有加\,添加
4 o0 y- `9 F, y dirpath=[dirpath,'\'];6 l r5 ?6 F+ X, t& Z
end0 U I3 }& t1 h4 l" a
' m) r: x1 ^& u: z1 V2 D3 y, S3 I: @
%先取出目录下的文件信息
* L( |0 ]& f$ |) Y1 Mpic=dir([dirpath,'*.',extname]);( C7 u$ _$ w% d' a" q
filename=str2mat(pic.name); %取得文件名4 p9 E& [7 i6 s/ w# m f0 e
. {/ b8 y& S7 |% r* G* {0 @# e
%调用函数
8 t# h" u$ m# a/ ~% I% I/ nsortfile=LengthSortStr(filename)9 T7 G5 h4 c, L6 I( Q, U
复制代码
$ a S1 g2 k1 q f# }/ S! E3 D' O r( N$ n; K0 R, S
9 x" g4 I# S8 w y# b
|
zan
|