- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:! _1 d2 _, s) h _" r2 Z9 m
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是! W) M. c0 |" P3 \3 }
1.jpg; E2 }2 X- x0 ]
10.jpg
! D0 |8 s! m- J& @100.jpg
* U7 b" I% m, P, a101.jpg
: o' w/ E( O3 Z# e7 i就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。7 A. {5 a9 F; i1 l2 Z$ W1 ^8 P
) e! s) v$ H+ m6 W( j# I
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
; H+ j4 |5 ?0 o6 H5 W当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。
8 a E/ Z1 T, I9 [; V5 d5 W% H如果不是上面两种情况的话,本文就是实现从小到大排序。
( h7 G8 t; o& {' h
- d0 [3 `, }/ `: M- I' f) f+ J# Y. ~* J3 M4 Y* U7 l- F" @
提示1:文件名的获取' O! a4 Q# n E' ?& o9 I* G: [! B
通过dir可以得到目录下的文件名,比如:0 k7 X- j0 f' Q4 |" k0 n g
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。! A' v$ Z. B6 w8 j
filename=str2mat(jpgfile.name); 6 j5 d4 n" w# `- ^! n3 C. Y% j+ Y
0 e2 N2 T; K! \1 K4 W) e5 |' m) D提示2:字符串数组9 [. R' e# A3 {0 m3 ~
先试一下:
' D( s* o- _% h H I/ }8 c/ U( Ustr1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同# {7 \ M3 J9 V0 ?8 K" |' y, J( o
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同
+ c8 p: V- s$ x: ~( r1 Zstr3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。- b) _" ~6 r- p+ n
4 L2 s1 a0 ~5 L- L
这样就导致上面得到的filename每行的长度都相同。' Q& p! a& Z; C0 ` {
; R- x9 h1 ?6 o- k t1 S: S4 O! E- V) S5 b F
本文原理:
7 j# z) v3 R n1 Y6 l先判断每行最后面有多少个空格,* g$ b& Q$ n y- X- l. o" G# D
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串! L2 k1 U7 z; p* W7 S2 j$ q
这样排序就可以实现上述的文件名排序功能。( r- R$ E- R: P! M4 A# O
+ W( s3 H; I# ?$ T( h
4 ~+ y8 K5 S t* W& ^+ v& I本文代码:
* [* H( P; J" Hfunction varargout=LengthSortStr(str)- p0 d7 Y: Y: _8 ]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' }1 z/ g1 K/ [* a8 m4 Q" c$ W2 v%Argment: str文件名组成的字符串数组" @# n2 g- N% ?. @7 |% R2 A8 h, ~
% : 输出参数同sort函数
! K0 L: f& N& c; t" c8 L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( i. w$ J, b8 i t4 X( m zch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
. K4 A' c2 J5 _, M2 m- x$ w9 n8 h) i7 ^7 e0 d! }
[N,MAXLEN]=size(str); %个数以及每行的长度1 ~8 A% L, _1 }+ I
newname=[''];. J3 {( [0 o: z6 {
9 ~ X) g0 |# T1 S$ ifor i=1:N
! {8 \$ i8 z2 J: \" W- E$ m5 ^ BlackSpace=0;* y, }% H( {: t5 S
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
, \1 g) J$ V# F BlackSpace=BlackSpace+1;( M7 ^ w- V7 \" z; i
end
% f, P- h, ?5 ~% e. ] p- G %将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格6 S+ T* L! b8 _0 Q- i0 Z
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
1 g8 H9 ?7 W4 y) X! ]: ^5 s Z4 P Dend
9 B3 E. g/ j' O' h+ P[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号) q! b- v* m% b! t2 _( V! Q
sortstr=str(order, ; %由这个序号生成原始的排序名
- }% P2 Q* H: |# e- c, y( T* K6 O3 q2 A# z
if nargout<=1
9 s6 G% t' b7 l varargout{1}=sortstr;
5 N0 B# [4 P" i' o+ L+ q2 l; G: @elseif nargout==27 E$ _2 V; |8 Q( J; z. K
varargout{1}=sortstr;
5 V. L, H' {: b" ~! }: W0 T9 t varargout{2}=order;
( k* \ F2 w3 r* q, b" aend. }/ L, Y. B G; t% C
复制代码2 C$ D' S* D/ K
实例:
- P4 {4 Q' }3 e+ \%对D盘下面的bmp图的文件名进行排序0 r) R4 O( | a- v1 [7 u+ p/ k5 x
clear
' N2 \) V. P8 K: b# ^& g/ k" Fdirpath='d:\'; %路径
# O q# ?, n% ^" Bextname='bmp'; %扩展名- x' C+ ~* g. I; N; k& T
( s' U9 ]. s S( v# v
if dirpath(end)~='\' %如果路径后面没有加\,添加
* e" G" b! f( e$ {) c+ } dirpath=[dirpath,'\'];! M$ z# f, ]; a: H9 C
end
3 L9 M1 X7 F" P7 G. U& c
+ Q/ j/ E. m! {/ h% p1 p%先取出目录下的文件信息
; v; A0 n' F% c5 V* G1 ^* Npic=dir([dirpath,'*.',extname]);
& s# k) K+ e3 s8 g7 rfilename=str2mat(pic.name); %取得文件名
( a5 W3 A% F1 c1 m7 G) r6 I; O, H9 o4 g) u5 W
%调用函数
) o& j$ N5 S( F! n2 jsortfile=LengthSortStr(filename)
! d, c- S4 A9 ~- E3 ]& g复制代码0 w, d0 ~5 k6 l4 ]0 n
$ ~# U# x. P( W) J ^
/ @) I( g) Y2 C0 c |
zan
|