EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
matlab文件读写 1. textread 2 U. ?% w% g, Y
最常用的方式 [A,B,C,...] = textread('filename','format') d& U% X5 @0 J# h
这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果 如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件7 w" j+ ]& K( I3 ^; S! S. C
[A,B,C,...] = textread('filename','format',N)2 \, R4 n, d: x
文件mydata.dat是
+ L6 `* S6 I2 }9 V0 CSally Type1 12.34 45 Yes
/ @; S4 Y% C2 g7 t; O# H3 \[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1) 该函数还支持更加结构化参数化的读取方式* f! {* w E# y6 r R6 }& Q
[...] = textread(...,'param','value',...) - `( n% o! |8 s. O+ Z% X
其中value 一一对应于param
# g9 g$ S/ H3 Z文件data.csv是" Q. v4 ^8 G$ B0 N8 `. j
1,2,3,4,,6
6 a: ]; R. V9 |$ \& I7,8,9,,11,12
$ k" y; F' d5 g; g& u+ X用NaN填充空单元:
' b9 n3 T/ p+ C# ~2 E+ ?6 `: H( Gdata = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);
2 `. Q4 C& o+ a {( |6 yile = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', ''); 注意,正如该函数的名字所指出的,他只能读取文本文件,
6 S6 U; r6 _- w这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止4 W$ y. h/ ^4 n8 c' X' I
这个函数的优点在于不用先fopen,也省了fclose了。5 D( x$ `4 h* L- l
详情参见 matlab help 2. fscanf
& @1 ^# l0 F$ U; ?; g8 d9 WA = fscanf(fid, format)
! }( {3 q% G$ I$ J8 X[A,count] = fscanf(fid, format, size)
2 w' o& N; s+ t$ |+ v无size域时或者size=inf时,读出整个文件 注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量
' z: g8 ]2 {# }- [' g: ~) Q如果只有部分格式符合,则只有符合的部分被读出,然后停止
7 G* C. i1 B9 r7 C" U+ R7 L注意 %i 格式 Defaults to base 10 integers. Data starting with 0 is read as base 8. * M0 e, O2 o4 ^2 a* i6 u5 p
Data starting with 0x or 0X is read as base 16.
4 O' j5 U# R4 t; @当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。% g9 S/ i6 w- l7 {$ P! o
注意,当size = [m,n]时,表示要读取m*n个数,但是并不是直接把数据组织成m行,n列,而是依次一行一行的读,然后一列一列地写,得到的是n
行m列的结果,需要转置一下。 An asterisk (*) Skip over the matched value. If %*d, then the value that matches d is ignored and is not stored.3 s1 @2 b. r4 G/ w. b
尚未用过 5 n; x% b# I$ }! q4 Q* R7 r
3. fread0 Z& O! ?" u% f; G
A = fread(fid)
5 f. ]4 e" N. g1 h; j; s3 AA = fread(fid, count)% [4 n- ^0 A) O# X# h L
A = fread(fid, count, precision)8 \- x o: N# L n; x
A = fread(fid, count, precision, skip)
( ]) @; t R- t: [- mA = fread(fid, count, precision, skip, machineformat)
- J2 X6 a8 f/ z# v# t读取二进制文件
4 T6 O, e: ^/ x不指定count,则读到文件结尾* [* C3 j% T% o+ A- o
不指定format,默认uint8
& q9 v' w H7 ^( Y默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式
$ _' L. q" `7 m8 c内建pointer会记录当前读取位置,以备下次从该位置开始继续读取' I5 }3 a4 s# c8 X; i% O
还有skip 若干比特的功能,尚未用过 4. fprintf
% x! k& i( F1 e2 |. Dcount = fprintf(fid, format, A, ...) 如果没有指定fid,则可以用来屏幕显示字符串$ o% b) S9 a# @- U, L
注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
/ a; Y' X; X3 L5 R8 R3 O$ N如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印! q8 S4 m1 k$ v5 k. c7 ^. o
for m=1:length(A)
, L# t' A! O ^ f+ }( P- T' n: f) b fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;
( i) a X7 r) _end %d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。2 P( h: E5 H$ \, W5 N: V5 [: G3 X
%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果 测试方法如下: fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1)); 所以要看数据的范围,选择合适的打印方式 不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。
) \3 l" L- s. u9 U而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况 if abs(x)< 2^31- ~3 A& Y3 e6 j3 g6 w( b" r$ V
fprintf(fid,'%d', x);
6 E9 l3 G: Z( j; J- x$ S elseif x >= 2^31$ F- [: R: R4 M3 s( o
fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));
6 b" T& ^( `2 a6 S elseif x <= -2^31
. |# K- M& l2 N fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));; D" ? B8 s+ t
end J( c* S. g* }, r
fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失 format long g 以非二进制方式显示,而且不受小于32位的限制 5. textscan
7 f' X e0 T1 [6. fgetl ftell 7. fwrite
! o& j9 ?6 ~" Y! _5 h& G" y7 `1 o Q
|