|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( f4 Y0 |3 r* _+ O- y
Matlab的textscan指令
6 n' f7 v) j0 N: G' f1 s最近在玩学长给的一个资料档,里头有文字和数据混何在一起,要用Matlab来读取. 要是以前的话,大概就很笨的用手动的方式把文字去掉,再让Matlab来读. 不过最近才发现Matlab7的一个新指令textscan可以很方便的协助读取文字档中的字串与数据矩阵. 利用这个指令很快的就完成读取文字档中数个不同大小的数字矩阵了.
$ H* E5 i5 [( s3 M. x% O 7 H( a5 Q: e$ u8 {
textscan指令在matlab的说明档找得到说明,在此就不赘言了,有空再写下相关的心得.
% s3 m" m( d- O) `2 h( t7 y: i 9 }$ ^$ ]( S. k
* x: s( l1 O! w, }! U8 z举目前的资料档为例,首先头4行是文字,要忽略,接下来是123乘1个数据. 一开始我的写法是:
# _1 K) \9 M' X8 C- A* X+ X%skip strings (total 16 strings): b! b2 h- {; \) B
textscan(fid, '%*s', 16);
7 j& Z& i; s& Q& ^- u1 \%read x axis, x* q9 [: q8 F+ _* S( n
xs = fscanf(fid, '%f', [1 123]);( \( Z1 k+ p" T. p6 T
* _! x) l4 s3 c: }) u8 l%*s代表跳过一个字串,然后反覆16次. textscan似乎会移动档案起始读取的pointer,所以fscanf会接着从第16个字串之后的资料开始读取,相当便利. xs为1x123的矩阵
+ Q9 d; J- ^. [0 k9 R4 t3 t( Q2 ~5 _6 G ) R; R1 b- s c
另一种写法是
" f- ?# ?* E1 ?1 i1 _xs=cell2mat(textscan(f1,'%f',123,'HeaderLines',4));6 C, D) h$ X* @, `' _, z& w( A
4 C Y4 X; A2 Z! |8 P" K! W2 b当中在textscan中加入headerline表示要忽略若干行,在此为跳过4行再读取资料. 最后xs为123乘1的矩阵. textscan给的格式是cell,所以需要用cell2mat将之转成matrix.: v$ I8 _* `" [. W
* V5 b" J4 h& b# j8 B
, y' h7 L4 s# b- e# ~* d资料档的最后有个123乘34的数据矩阵要读取. 最初我的写法为:% B. K) O$ N D" H& R
textscan(f1, '%*s', 13);. @7 `! ?& ^6 h3 d$ ~2 g
ez = fscanf(f1, '%f', [34 123]);6 N+ L' @" @( E, w
6 a- K8 l& s% G9 ]& ?! V- c
最后ez是34乘123的矩阵,转置后就是123x34原矩阵
5 e) _/ }2 `% X, \/ _$ ? # \9 ~9 X S6 B1 ~# L" {
0 B* @, l7 w% z1 N8 Z
另外一种改良的写法为: d; D4 m% C: m) p% B, B, ~
FormatString=[repmat(' %f',1,34)];
. V# ]$ l3 S0 o t, Gez = cell2mat(textscan(f1,FormatString,123,'HeaderLines',3));3 `: M m) Z: S/ C, t: q( J* }
+ k5 K F; x7 E8 x, r
实际上要忽略的行数只有2行,但是下参数的时候却一定要下3才会成功,可能是之前的数据尾端也算一行. 最后ez为123乘34的矩阵
! r; q# W" `. W8 x. l, O$ |
" P5 F7 f! i/ U) r n9 X& Y/ `若搭配上matlab网站的范例利用loop来侦测行数,使得读取资料档能变得更有弹性,不过在一般的状况,以上的方式已相当受用. |
|