EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
matlab文件读写 1. textread , z) }5 {% _. g8 L2 i+ o$ h
最常用的方式 [A,B,C,...] = textread('filename','format')
% x; }8 Z9 _0 |% Z这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果 如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件
( t& w6 j+ `% i- Q- a% t7 _! K% D[A,B,C,...] = textread('filename','format',N)
, Y @9 ~- x4 x+ ]文件mydata.dat是
% O, \' Z2 c$ L5 F: M1 MSally Type1 12.34 45 Yes; y" X4 R) Y, C" _. M4 ^" a
[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1) 该函数还支持更加结构化参数化的读取方式" u) O7 H& V) j6 W3 n
[...] = textread(...,'param','value',...)
b" y; A4 B% G+ j4 ^其中value 一一对应于param
" `6 M) b. J3 V7 Y4 u文件data.csv是5 S8 M" k$ c# R" u/ c0 i
1,2,3,4,,6
2 r- Z4 |: R P7,8,9,,11,12
. [# B+ }! f ^# u用NaN填充空单元:0 t3 z* p- u. K& w3 \+ J
data = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);" ?, F! o! m3 y2 m
ile = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', ''); 注意,正如该函数的名字所指出的,他只能读取文本文件,- |( u# g, h. ~3 M
这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
2 Z! p8 G/ j5 j9 X这个函数的优点在于不用先fopen,也省了fclose了。
, Y: k5 B1 G T, J6 X7 i详情参见 matlab help 2. fscanf
H8 R: ~4 t4 o& ~A = fscanf(fid, format)7 I0 y, I* v4 }: ^' s0 |
[A,count] = fscanf(fid, format, size)
% j; p6 [. n5 i4 y无size域时或者size=inf时,读出整个文件 注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量 V9 Q& S- _- r2 z" e' I' ?
如果只有部分格式符合,则只有符合的部分被读出,然后停止. I6 V8 N7 H3 y
注意 %i 格式 Defaults to base 10 integers. Data starting with 0 is read as base 8.
5 T( a# [( Z0 K! w* B; f5 _ Data starting with 0x or 0X is read as base 16.- L, _' W3 v1 z- ~
当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。2 y1 p& G* |, D9 L& M
注意,当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.
7 ~3 U0 ]' f4 x! C5 I尚未用过 4 c2 J1 @ h" c" j
3. fread
& Y6 l3 }6 W& {2 TA = fread(fid)
# x, K& W, b/ h, @: LA = fread(fid, count)
9 b+ O! l& X: @( m* D. |A = fread(fid, count, precision)
% r5 [4 F7 Y l8 D1 {# TA = fread(fid, count, precision, skip)& ?. h' _; L4 G: D1 C Y) p
A = fread(fid, count, precision, skip, machineformat)
, F% t! v' h$ V* k" n- K* x/ _读取二进制文件( i0 ~8 F# ?4 m. U2 t4 J) ~4 R
不指定count,则读到文件结尾! t1 Q- _- N1 p* c' ^
不指定format,默认uint8# H+ w5 l: ?5 x% }& |' C" u
默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式
2 w5 l" o5 R( w: q6 U+ _内建pointer会记录当前读取位置,以备下次从该位置开始继续读取
4 u$ E$ S1 d4 x+ r还有skip 若干比特的功能,尚未用过 4. fprintf
4 A# v$ L% m5 z7 ^ a e ^count = fprintf(fid, format, A, ...) 如果没有指定fid,则可以用来屏幕显示字符串: l. V; ]+ {$ O0 G
注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
4 O p' o$ O+ H$ v- ~% U0 E如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印) ?- i- U9 l0 w$ g
for m=1:length(A)
- @* A+ K# D9 a9 S' x. k fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;
) v' j0 M; G1 p; Q! N$ _end %d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。
5 |1 C+ W; u( A* r2 Z$ N%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果 测试方法如下: fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1)); 所以要看数据的范围,选择合适的打印方式 不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。) h5 |) x* U$ o# r/ X) Z( w( U+ I
而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况 if abs(x)< 2^31
& j) [9 | ^+ H0 f6 D" H) G/ r fprintf(fid,'%d', x);7 a, r8 S' C. d9 a" I! { G
elseif x >= 2^31: O. \ q. M6 z& A7 m* u* O- P& _1 _
fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));; _. x1 k/ G' k. o# i6 J
elseif x <= -2^318 y* x' p* t5 g( }; `
fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));
' c' s( l( G1 P9 G1 Q ?0 T end
) D4 E# t* N& Z) ]fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制 5. textscan , n5 z3 ^3 m- l; J
6. fgetl ftell 7. fwrite
_" H" N# O: |7 t8 y+ o: X6 T! H' Q) C; X: }" t$ a: g, H- }
|