- 在线时间
- 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研究生数学建模竞 群组: 数学中国试看培训视频 |
由来:
, I0 i3 ~; B" O$ R9 u- @0 Y7 m" R手头上有一组100多张的jpg文件(尺寸一致),想把它们通过matlab弄成avi文件,然而通过sortrows函数对这些文件名排序时,发现它的顺序是& a+ k- ?/ L5 Y+ p3 l A" L+ N
1.jpg
9 }0 R8 r6 s0 j P10.jpg
3 D1 B& ~# _& Y1 H+ l100.jpg
" {( b5 E0 X5 e9 C; s101.jpg
! ]4 r; Y) t& Z! v: R2 l; z# i就是说sortrows是按文件的ASCII来排序的,没有考虑到字符串的长度因素。# h ~% J6 E1 B& p* K, n; }; c; e
, } _2 @, j2 s7 e5 R' f; Z6 P7 r
当然如果文件名命名是001.jpg,002.jpg之类的。那么排序应当没有问题。
$ y; v% }; c* ?当然如果文件名是连续的话,我们也可以用num2str(i)来构建相应的文件名。& n3 w# b2 O, I$ B, k" B
如果不是上面两种情况的话,本文就是实现从小到大排序。
' k1 v* }; w9 j+ b
3 U* t0 |; t% n) Q$ c
% k* O. W7 v2 e( d" B5 F) N, \; ^3 R提示1:文件名的获取
' C7 U/ c2 C4 Y$ `/ v通过dir可以得到目录下的文件名,比如:7 a6 {; a- U _6 L1 v) T4 I
jpgfile=dir('*.jpg'); %可以得到本目录下所有jpg文件的相关信息。
# C$ { }& W3 X3 Pfilename=str2mat(jpgfile.name);
( }+ ^0 }& g# ^/ D0 X ^& l
, s+ E9 S. T0 U提示2:字符串数组 O0 ?* [ { Z% [
先试一下:: `+ x" x8 y0 M: `3 s) }7 U1 V
str1=['mat';'lab';'sky'] %这句没有问题,因为每个字符串长度相同9 Y1 y K9 R8 e4 ~0 y/ \
str2=['matlab';'sky';'love'] %这句会出问题,因为每个字符串长度不同0 k% u5 j; T8 |( g i
str3=strvcat('matlab','sky','love') %这句没有问题,虽说每个字符串长度不同,但是它可以组合成字符串数组,不过str3是3*6的字符串数组,每行的长度都是6,系统给字符串不足6的后面自动补空格。0 _8 X2 b; w. D$ w4 v
: Z7 t2 K. X- ?这样就导致上面得到的filename每行的长度都相同。
0 E' w5 y3 U; p- |. S. Y/ \ _! t* P. h% v4 m) N5 k
2 w5 ^) o; B9 L. j# C$ o( q本文原理:" i7 z j( X) R
先判断每行最后面有多少个空格,: s+ `0 n% R& X) J' J5 z y% D
然后在每行的最前面加与空格数相同的字符(该字符的ASCII码要很小),组成新的字符串9 A8 D* \/ z r- m
这样排序就可以实现上述的文件名排序功能。* E7 m9 J$ ?7 o& b& }. V3 T2 T
/ f# u0 D! s# r# J* c
6 [0 h2 ^4 P. I本文代码:
/ X* H* M2 t! H: T z0 zfunction varargout=LengthSortStr(str)
+ o5 {& h8 a. ?/ Q& t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 V0 d1 B* D- ]6 G% X# R2 |
%Argment: str文件名组成的字符串数组1 q' |( M( Y9 [& [1 |. O
% : 输出参数同sort函数% W' E4 U: R Q8 e; h( p7 z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%. _' t* e; } a! d1 y
ch_ascii=1; %用ascii码相应的字符放在文件名前,这个值越小越好
B6 z9 S8 u- n- @& S, E$ P' |+ i* T+ p! v, v0 E/ @8 N3 L
[N,MAXLEN]=size(str); %个数以及每行的长度3 C# v. k" {) Z7 }0 ]* e2 t. I
newname=[''];0 t* @2 U- p6 U4 z, i. {- j" U
& O5 J% }3 g; q; I" xfor i=1:N, |+ T3 g# x0 v8 j7 Y
BlackSpace=0;2 m" \. j! f6 y V( V) S
while (str(i,MAXLEN-BlackSpace)==' ') %本行有多少个空格
5 O1 A# c/ ~; ~5 G+ C BlackSpace=BlackSpace+1;
* U: y2 Z8 M6 Y' E& Y end8 G- Q3 E, O, _# p+ l. H1 t
%将本行后面的空格用ch_ascii补在最前面,并去掉行尾的空格: q+ j% f( _8 q; F$ A
newstr(i, =[repmat(char(ch_ascii),1,BlackSpace), str(i,1:MAXLEN-BlackSpace)];
: o- p2 h4 x5 o9 B& ?% |9 L* n B/ {7 Cend
& Q1 V5 M6 Z9 b' B4 p$ I[sortstr,order]=sortrows(newstr); %新字符排序,主要要得到排序的序号+ Y: j1 X+ ^4 B t0 Q( D. F9 w; X0 r
sortstr=str(order, ; %由这个序号生成原始的排序名) Y( E% v0 }/ G- M
7 M, h" E3 h" k" D% M
if nargout<=1
5 a1 ^0 k* z( g! q1 p varargout{1}=sortstr;, _0 Z0 R% |% y& V% M
elseif nargout==2
( N7 C2 C% `: i$ V, s varargout{1}=sortstr;
~3 ]4 N3 s e& ` R& q varargout{2}=order;
6 y7 f( p- ^- ]: W$ Aend
- [7 B8 o# U# X复制代码+ g8 n4 W$ i3 b7 P' j
实例:( L9 C. F: E- T8 M N! a; Y
%对D盘下面的bmp图的文件名进行排序
* S5 C% x" J4 b2 D1 @+ ^+ iclear# J1 C" v# r% [7 T* Y
dirpath='d:\'; %路径' x( Y, J4 d5 x" s& k+ w" o
extname='bmp'; %扩展名
) V! @8 \' S+ r! d+ c
2 k T9 f$ n" Nif dirpath(end)~='\' %如果路径后面没有加\,添加( C4 D; j7 q( ]
dirpath=[dirpath,'\'];
5 ^$ N+ t. _* G1 N6 vend. E' \; L2 o! d+ d2 m
4 G! a# M# K- q/ x/ d1 O; Q%先取出目录下的文件信息
$ X' f! O; H- q* b: epic=dir([dirpath,'*.',extname]);
/ ^: U: Z5 L7 K8 mfilename=str2mat(pic.name); %取得文件名6 J/ x& u% F" V4 n* O
R: T$ g7 J) i- t9 C& _) y
%调用函数
% d7 `4 d6 I; D2 E8 z4 [7 a' rsortfile=LengthSortStr(filename)5 t3 m1 ^8 t6 p' }) g' ]
复制代码
0 B! @6 j6 [8 T$ f3 G1 I: d6 Z, q8 u4 {" j6 l: P( j
( _9 @. n( f4 R8 l: \, D
|
zan
|