- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
4 n) j9 ]( ~2 e手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
, T- b1 F8 f: q: s5 H! y1.jpg
% ^! w l+ T" f4 i7 _& y7 b10.jpg
8 d T$ O, s' Y! K% ?4 t9 d4 \! M100.jpg
, H: r: _) W$ }: u$ ~101.jpg
2 i. | ?6 e& h% f% b' [/ Z就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
$ n- L. S, @$ z, B; t! L7 _* ^# B2 a' f
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
# V, y0 F; {$ ]/ [) R4 L- F& \' X当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。/ e& B/ i% R! k. g T
如果不是上面两种情况的话,本文就是实现从小到大排序。
; c7 `' x0 w6 r5 l; p- p
$ U5 O: s9 b7 `* d, ?/ `5 A( L" }) A, i' g% F" x
提示1:文件名的获取4 T" k6 J) O5 [
通过dir可以得到目录下的文件名,比如:
7 w# v( Q# `: C ?# Rjpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。8 z$ Y7 Q' U: n9 f ^9 @) n
filename=str2mat(jpgfile.name);
6 M9 ^- |' D: ?6 F4 {+ J* ^8 a# x) x: x. l
提示2:字符串数组: K. V9 P# o, b& `% A/ q. R
先试一下:7 q- b1 `+ i3 c3 P) T
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
* C' `+ a4 l ]& a8 K% R wstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
, l. k- t, i8 Tstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。2 a$ [0 h5 {# k3 G7 j; J2 j) c
4 ?8 x! B, Y0 m/ d: D; [
这样就导致上面得到的filename每行的长度都相同。) R/ D. N5 b" {' ], I, n3 g8 P
1 U& }+ U! K" U
. `/ y5 V, U- M# Q% ?. m本文原理:
" F# |1 h$ q0 W* d1 ~. u先判断每行最后面有多少个空格,5 N) i+ w; u% F; N
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串* h+ [5 _! s' H% ~, s1 Q
这样排序就可以实现上述的文件名排序功能。( k4 b7 }- S9 d$ y" e9 Z
; A( s o& a( n& f4 o
" B r2 y: F1 m# ], f! J3 i0 ^
本文代码:
: \2 j% R p# @' M2 ]function varargout=LengthSortStr(str)0 E7 F+ b- F- S+ N1 K+ Y
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ }; ]0 `& F% m0 m0 T) l
%Argment: str文件名组成的字符串数组6 L6 q& i7 ], E$ {# D
% : 输出参数同sort函数7 l. O4 P1 z2 T: g2 f, N
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 i0 K7 U3 |9 h. M6 Xch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
% M* |& W/ A1 }+ S% ~
6 Y6 p0 A; o8 U# Q4 m[N,MAXLEN]=size(str); %个数以及每行的长度/ S$ S! N4 T+ w' h
newname=[''];
" e6 e; _9 n' ]( F6 O+ T8 L( Z: f! g
for i=1:N
! s5 A- z8 w9 N) {8 ` BlackSpace=0;
5 c2 z. y( m$ Z, v4 d while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
% ]/ f& T5 L0 d# V. K8 f" w& S: s BlackSpace=BlackSpace+1;$ T# `' n9 V% V4 @% ~6 I
end" ~. } d5 J; X" \& g8 V8 E( J
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
- n$ o( g3 T3 n1 k- o newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];! b0 e! |0 h- G( @
end- { {6 ~8 A7 T! G' v9 p7 W. E
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
* S6 o+ |5 t8 f) A4 L8 lsortstr=str(order, ; %由这个序号生成原始的排序名
+ a5 c" @' C0 a( @# V
. ^ C+ i- N' K2 ~if nargout<=1! L; s6 L5 ^1 s" J
varargout{1}=sortstr;+ i4 t6 \; S$ Q. t: r
elseif nargout==2 P" @% G6 Q* h- x6 Z3 h* Z4 Q
varargout{1}=sortstr;
7 f- G3 x, z! ^8 u3 @ varargout{2}=order;6 J b# k/ u3 m' Z7 u- F2 y
end3 |0 i; Q# d9 e0 ^
复制代码/ [8 o& k5 S5 Q
实例:
/ w& ^. o% m* O' Z0 K4 m+ ~%对D盘下面的bmp图的文件名进行排序5 S# S3 f' `: [) Z; c7 M5 [
clear
0 |8 N# E3 i$ P/ v7 R% mdirpath='d:\'; %路径* O: M/ [+ k. f; R1 y
extname='bmp'; %扩展名
% G0 _, A- l& s9 G8 l; ]
& r% w* [( c4 v( Aif dirpath(end)~='\' %如果路径后面没有加\,添加
6 ~9 O8 x5 ^' U dirpath=[dirpath,'\'];
! R0 C% `) _( I; s; O/ ?9 i( _. pend
& Y3 h" a$ P! V3 M
7 x0 C- N9 T2 s0 C: \: K* U%先取出目录下的文件信息 W' Y, j+ K* h- X7 x6 S/ ?: h
pic=dir([dirpath,'*.',extname]);
+ v% Q# R( z. p) ]" W, r% Cfilename=str2mat(pic.name); %取得文件名0 O4 {0 V& k: S9 p# }; ~# j `# @
6 L4 {. j6 h5 C/ z7 r( p7 R8 S7 a
%调用函数: g$ w2 h0 k+ j" g$ G+ _8 X
sortfile=LengthSortStr(filename), A7 [& |8 W. l+ A
复制代码
/ p* M+ K2 b N
5 V. \. n8 i) l$ R- {+ R
7 [+ d2 Q8 T. y7 @& o: ]. j |
zan
|