- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
. u, _. P$ i0 H& e; r( \手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是5 L7 A3 Q! |* {& W) h; n/ |
1.jpg& C7 n9 s8 C Z- }3 o+ a" r k; @
10.jpg( t- R* X0 k8 |* Z2 A
100.jpg
, K9 q9 T- V+ J* q' W101.jpg5 b+ j# ] z8 ~5 c
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。
. K9 x9 e' F- _8 Z5 z
8 J- f. {+ P) Q& H, s; B$ ~" Y当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。' R7 Q4 } C" r" @
当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。1 W( z: Q3 h# @, i2 @1 U8 p
如果不是上面两种情况的话,本文就是实现从小到大排序。
" W6 f1 I$ R- \, y4 z
' A& a- y* F6 ]0 E- g; k4 y$ W8 e0 u% J! w, V
提示1:文件名的获取& z* W; P: u" d5 B( ~1 a" f3 ^
通过dir可以得到目录下的文件名,比如:
4 s8 [1 g2 R3 G$ |: `jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
* y; f2 H, u% M0 ^; Z* b; q1 J; @7 Yfilename=str2mat(jpgfile.name);
6 N4 [( d% M- T' Z+ s/ W# E* ]5 k) r; F, y% T% s# e+ i7 G8 @
提示2:字符串数组# U! Y! i; P4 j$ z$ @
先试一下:
2 Z% u+ @# G: Sstr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同" c5 g# y$ K: d+ q; ~
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
1 B6 W! u) X( wstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。2 l% q$ O% Y, h& l v0 ^; U. T
, T; t4 ~3 w3 ~, q/ m! H
这样就导致上面得到的filename每行的长度都相同。: n$ A$ Q7 ?7 p' ~5 }# k6 I& J
+ U- Z1 s, M, Z7 z6 Z" j
: V9 N% y. g6 [本文原理:, Z- W5 D1 T! V) Z+ F3 ^8 ]
先判断每行最后面有多少个空格,6 Y, L/ F8 Q1 t* G
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串
8 h0 c9 J2 F& W这样排序就可以实现上述的文件名排序功能。1 F8 Y7 E9 H1 P2 z
4 O% N) @" e! z/ ?1 h
0 q8 y2 g. o. |- R2 O2 ^本文代码:
6 a+ u. F! J* T; F2 G* R- ~: ~4 pfunction varargout=LengthSortStr(str): ]3 O7 e. ~$ H a! e
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 [: q# C6 A& ~% ?* H: ^%Argment: str文件名组成的字符串数组2 x: N c' C4 o3 S) e# Q
% : 输出参数同sort函数$ {# u$ D6 \0 a( L1 _
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
) [/ I' C o9 `' Z, e7 Jch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好' q/ x5 g7 N0 l! x
3 `6 y& p' w/ \# o z j
[N,MAXLEN]=size(str); %个数以及每行的长度
7 \& j+ ?* I1 f8 |) i, Anewname=[''];
" s& p7 k. t4 X, M2 d7 m! g1 I) K6 ]' M6 y% R, J
for i=1:N
1 W) f9 Z2 T3 E- b7 b. i/ S; Z BlackSpace=0;/ k1 j0 v# r! T
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格) y2 {+ T- J% [0 e2 C* Z8 o3 \
BlackSpace=BlackSpace+1;5 ~8 j$ r: ]& ~1 X% d( V
end9 r# K/ ? o$ w; i8 O
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格1 \, N6 ~5 n. h
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
" C" x; K- M5 \& N0 Aend% N7 z; B9 J T: t% x1 M6 \, X
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号1 k! k- q+ y* Q, P1 W1 h6 ]+ L
sortstr=str(order, ; %由这个序号生成原始的排序名
- c+ |* M$ J$ L" j; v5 ~ u$ H4 `& f# M! d( U
if nargout<=1
% W9 G: \8 F$ O* I( M7 h varargout{1}=sortstr;4 Q! v4 G2 H3 y. p: C/ { g
elseif nargout==2
# \" }6 ?0 R+ m8 N* y; ]9 R* @ varargout{1}=sortstr;
! G8 _) O! m: H3 }- N r5 J varargout{2}=order;
* U: O j# ^; |6 E, D7 Dend
) A- n, }6 a$ A# ?% I复制代码- D, H2 l/ ]$ r& }; G0 k7 {
实例:
" _$ P1 ]! r! r%对D盘下面的bmp图的文件名进行排序. C: ?. Z. ]) W& |$ i
clear
" B0 d. r# L- s8 t/ ]5 F" R# kdirpath='d:\'; %路径
+ m3 v( b- C, Kextname='bmp'; %扩展名. B" s9 w [& r* E" e" s
1 w6 V) U# g! C/ @% C
if dirpath(end)~='\' %如果路径后面没有加\,添加
; J* L& W; u- ]: ^! j dirpath=[dirpath,'\'];1 r# I; X5 b h+ P. L# C, J1 q
end
& r0 o" F# ?; ?1 H# b: k" `; e2 s7 Y2 U2 c5 q2 C* ~
%先取出目录下的文件信息
/ W3 A; y4 L/ f! t" i5 jpic=dir([dirpath,'*.',extname]);' ^7 }( e4 w4 O! Y
filename=str2mat(pic.name); %取得文件名4 Q/ a% q4 C; K- u( G
0 q, C3 v/ R7 h* T9 g8 Y5 \! U3 j
%调用函数
" U$ Z. S# n, k! w' }+ esortfile=LengthSortStr(filename)
( l% j/ P5 ^3 |8 ^$ G6 O" _/ v- V复制代码4 [) B3 E4 W& F' ?
+ V- y! d+ c1 F9 _- M# |. p3 X0 G) O7 Y, ~% p- Q
|
zan
|