- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:& ?+ o5 ]& a8 `: Z- I
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是
% l$ R) [' n: v& v1.jpg3 r" N! Y2 q2 Z2 Q: l
10.jpg& j. h9 _: \* v6 n
100.jpg
8 A3 G3 N. Q4 S4 ?/ W o101.jpg1 I/ w) `! |3 j2 q6 E
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
3 l$ W' E$ K3 I- x9 m8 H6 ?: h1 ?9 u+ e) c- G3 ]. J. D
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
5 p& E% V* _' e( `* {1 u9 J; \6 ~当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。1 ^2 P5 N" s5 F7 O- D% v8 l
如果不是上面两种情况的话,本文就是实现从小到大排序。
- M* _+ C- F$ g8 ~- z
* `% w' m% i, T, _
9 ?2 m1 `0 e/ ?# h" t+ H8 v2 g提示1:文件名的获取
3 q, H: P+ W# I7 Q. ]8 U( V* \, l; v通过dir可以得到目录下的文件名,比如:7 X% F$ {3 ?. m
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
- Z& e: F# c3 a5 e' ufilename=str2mat(jpgfile.name); : c, f) _! `8 Z
7 L- g$ B* N( e9 O& t, l/ @提示2:字符串数组
$ Y1 E5 D( ]0 k% [先试一下:2 [5 b- q/ I6 r! }9 d6 G
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
. u0 ]3 ^, y6 O9 |5 ]# q$ `+ Gstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同2 \# J' F L9 K6 f. e6 u4 T
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。8 H1 A( P. W: n8 |
1 t% q. J: K- ^# a( ^' J6 c9 @这样就导致上面得到的filename每行的长度都相同。
7 g. D* g8 |. J5 i# e4 M! F$ }* R
6 E# w* N* S- F; q& Y; f
* d8 s6 a2 X9 ?8 W本文原理:$ d% [7 V6 j- C' v$ y
先判断每行最后面有多少个空格,. @( W& a" s7 p5 u8 L
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串# s C- Q1 b8 X R; E6 d
这样排序就可以实现上述的文件名排序功能。4 A& d7 ]6 x3 E) z
, z9 l3 h2 q4 M% }& P) s' d4 p( Q" ~6 f0 H8 m
本文代码:
T5 Y) t, ]& dfunction varargout=LengthSortStr(str) f% O, E0 f! {9 q3 h9 o, Y) d7 l; W
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) ^4 m$ \% O8 Q: K- c, I& }9 T# r%Argment: str文件名组成的字符串数组
( S% A8 R( g* H% : 输出参数同sort函数
: N* F1 l1 y, p$ W3 |+ z% u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' v1 d* d3 n( v/ \* Sch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
* S; @9 Y+ ?% N% [# M4 X. ~4 c. z& G9 [2 b" @ p% @
[N,MAXLEN]=size(str); %个数以及每行的长度
. V& U3 m4 n5 knewname=[''];
5 y4 Y9 v8 @( _
w/ ^4 e& c# c0 X/ ]' ] Gfor i=1:N
" S) e. ~5 ]' N; g% _$ o9 g6 u- ? BlackSpace=0;
8 L8 u Z- x; D% M9 N7 d1 b# d while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
5 S3 P: q3 M: |* J+ o! Q BlackSpace=BlackSpace+1;8 T1 O) B( G5 }5 X7 I4 W
end
9 ? o( }+ |7 q2 C( w8 {/ q- c0 i %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格
: Q8 f* M, ^ M. b9 M5 Y8 C( d4 u5 D newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];+ W n. T6 ~( v! \; [) o3 y$ q
end" d0 V$ ^4 o/ [' h" o; }3 z$ t
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号" O% @3 g& x6 j' P9 \" x6 @
sortstr=str(order, ; %由这个序号生成原始的排序名
3 E' }; w% Q$ D9 \. z1 _, i* y, C: j1 ]( x H2 K* X0 n) T; Z
if nargout<=1 M$ o0 A/ Q; k4 W1 r
varargout{1}=sortstr;
; G6 Q( p1 ?) l% E0 R# {elseif nargout==2* Z. ]! c) |2 E. I; ~* V' m1 F
varargout{1}=sortstr;
+ v+ G$ }% L9 p* O+ W H: v$ c! k varargout{2}=order;. {/ y/ R& F& a# k4 K) H% h
end1 l! @- _9 x* y. `$ x2 ^$ Q. F- i
复制代码0 e$ M, f, V' ~8 k2 K! E5 F' [
实例:
5 Z7 y* w+ q. @) d8 p7 U%对D盘下面的bmp图的文件名进行排序- O% N- n* T3 S. g+ H& U& |
clear
& ?1 |; S* ] p1 P9 f4 S1 ^. G8 Ydirpath='d:\'; %路径* n d8 S) f* R4 t
extname='bmp'; %扩展名
# z h* r! ~( l' c6 U, j, @! m; \3 X* ~ f& i2 s
if dirpath(end)~='\' %如果路径后面没有加\,添加+ r( _0 d% g7 k
dirpath=[dirpath,'\'];
* m- |6 q2 s- f( O( iend) a. Y' @1 g9 D9 @
7 c8 N8 w0 @2 ?8 o
%先取出目录下的文件信息1 i+ j# n' m" Z. E; o
pic=dir([dirpath,'*.',extname]);. E+ W1 \# v) X/ Y' e+ Z* U
filename=str2mat(pic.name); %取得文件名: C" e4 E4 o0 f* C* F) t" k- Q
7 l! C- S% {8 Q* M$ h%调用函数% A0 h, r- n: R% G: U8 P1 R
sortfile=LengthSortStr(filename)
@8 s0 K% @+ `4 Y6 O" x复制代码
/ M# b' i" C. l: S
7 C h# s" E8 _( `& c, x5 t4 }6 o1 m p! T
|
zan
|