- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:+ A1 \0 G8 G9 V; L
手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是# T3 {5 O' K& z% W
1.jpg- h4 p% e6 M9 Y; Q9 s4 `- e
10.jpg
% G, B) b, e0 v0 D4 ~2 P100.jpg
; Y# a u3 A7 ^101.jpg5 _* H) u0 R5 x/ R
就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。' r! x, N: S: C, J; |3 l9 p
* j8 l# H9 `4 \) _8 W E当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
3 y2 h3 S0 o+ J0 B" o. q当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。! C$ ]& l: |: c2 v- e8 S' `
如果不是上面两种情况的话,本文就是实现从小到大排序。
. j( G3 T5 @ ]% Y6 E
6 R; h6 o2 k' k) A# W- H, W7 Z$ a& \2 W. a& z5 {$ J
提示1:文件名的获取6 S# v% K' |+ i+ W# z
通过dir可以得到目录下的文件名,比如:
a3 U1 V* M! i$ _1 ~: Ajpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。$ `* G3 i$ }% H/ h- B- j
filename=str2mat(jpgfile.name);
0 O8 j0 [0 h7 o5 Z
7 K1 J8 J! T- O: E% Q; D+ `提示2:字符串数组
5 c) {- |/ P2 @* N先试一下:! h, H- P, e. j. Z" W! K
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同
: ^& H6 u: h- X0 s6 M9 {$ w6 wstr2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同; d/ l$ l0 J& s6 S: o
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。; Q& x1 ^( F- R# D% B0 i
: a: Z3 n3 j3 H6 C2 A# M这样就导致上面得到的filename每行的长度都相同。
( A8 I+ Q4 d4 T7 H& A: I/ I' `0 e/ Z4 d
1 T; j' F: p& f4 ?
本文原理:& V% v$ [! P' G2 U: I# O# r5 l$ x& }
先判断每行最后面有多少个空格,) K- b/ V/ s0 V7 R7 z# g: s
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串% G9 c/ p T) @- F: K$ _
这样排序就可以实现上述的文件名排序功能。8 e S( | B! j9 C8 W; y
1 {0 j& x; }8 j# v' D( P+ V& I J4 K+ {% y; Y) i5 l2 @1 k' V
本文代码:' w+ {5 `6 _( m% ]) ?4 q. _0 i
function varargout=LengthSortStr(str)) z, C7 ~7 j) u' ?9 l- r# j
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' J+ K) Y. N' T4 T$ |%Argment: str文件名组成的字符串数组4 O% Z: b( |) M" A+ b
% : 输出参数同sort函数
* D; k3 U: S2 l' v7 R+ K0 r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. P1 O: d1 z1 S- U ]- q. S0 n @ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
! k6 V( X, t4 K0 p3 Z4 U- ]6 P; y$ r+ ~3 y6 c( p3 C
[N,MAXLEN]=size(str); %个数以及每行的长度
% X6 g$ G! W; z* V2 y s4 Xnewname=[''];9 `- H2 A& `+ j
$ W5 `4 G0 n) V5 c8 Y: `( Ofor i=1:N+ q l O9 v4 n) h) K0 y/ \( L
BlackSpace=0;# j! u3 @. L; K6 \ a& `0 H
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格( U$ y" I& F, C; B7 {: M
BlackSpace=BlackSpace+1;& A6 D* J, X4 h
end; {0 N' J! x4 i1 z) Q1 D) }& T
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格# S' v7 S% \1 p# n' _2 l
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
; Z. t/ T; t8 V5 gend# Z' r) Y% r0 a) }! [
[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号
. t5 b! u1 A' Isortstr=str(order, ; %由这个序号生成原始的排序名
8 A' `; B7 ]4 g! P: J4 y! p9 H5 w5 E, I
if nargout<=1 F4 F: b6 U' o3 S7 [" h" j* S ~
varargout{1}=sortstr;. h" U$ e# S- |7 ?& b8 ]1 g% ]: Y' G
elseif nargout==2
8 H; h0 g$ _# {) U" t6 K varargout{1}=sortstr;
2 w) k, r+ i! ? varargout{2}=order;
0 Q" q! N, Y) P2 ~( Q# Dend
1 H6 P1 x$ F2 \9 l5 x复制代码1 H; A: @0 n( _# H. O. c
实例:/ e4 [; ]" X4 y1 ?( T) I
%对D盘下面的bmp图的文件名进行排序1 Z/ _0 C1 g" d% s9 V7 v) r7 Y
clear
3 Q; D; ]9 d3 c" s1 E1 Q- o$ f* s cdirpath='d:\'; %路径
# o& k- n9 \. X2 aextname='bmp'; %扩展名! _$ ^ a+ I" @! h4 M% ?
4 J% e5 \/ C1 L/ }: B' K) u
if dirpath(end)~='\' %如果路径后面没有加\,添加
4 @3 i0 q6 M! A" Q/ O$ H1 ^ dirpath=[dirpath,'\'];
' B0 K- K- A, \2 iend
0 U6 {9 i) m6 y, E% O: ~& P
/ ^. A) Y; V. ~1 X% h$ Q%先取出目录下的文件信息) T* F& z% k# l* p, d
pic=dir([dirpath,'*.',extname]);: F" O* H/ V. J$ x
filename=str2mat(pic.name); %取得文件名
8 u! S0 V- ~; l! y& p7 ^0 M& I q5 b9 V1 C
%调用函数/ M' a5 x! v' ]: c: a1 U$ m, o
sortfile=LengthSortStr(filename)
( `( E) s C1 l0 b+ J$ j复制代码7 i2 f7 ~3 o, ]0 `5 C
$ W5 w/ U; S: F! @9 _" d
# [4 j9 U$ f. _+ M |
zan
|