EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
matlab文件读写 1. textread + ~: B/ B( S/ ~
最常用的方式 [A,B,C,...] = textread('filename','format')' h4 r( v: v9 i. Q
这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果 如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件7 S) ?6 c' v, x$ \8 k/ |4 s( a
[A,B,C,...] = textread('filename','format',N)
6 T" M! V3 a n文件mydata.dat是
\* i Q1 d; ?! a K z8 ^Sally Type1 12.34 45 Yes
% G f2 z# c7 F. p0 `% o! F[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1) 该函数还支持更加结构化参数化的读取方式4 d3 i f: d" c- q
[...] = textread(...,'param','value',...)
3 p/ g' P+ g) c) q其中value 一一对应于param
4 S1 @3 ?: w$ |. }文件data.csv是" [# w" v. Y, F9 i/ Y7 i3 E
1,2,3,4,,6
4 H3 r& h$ D8 [5 X4 v% M" U7 p Z7,8,9,,11,12
8 A/ Z+ [. C% Y. B9 A, k用NaN填充空单元:
) E% E$ y# |) e+ e# ?1 Rdata = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);0 z, O5 g7 w( u1 F/ I
ile = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', ''); 注意,正如该函数的名字所指出的,他只能读取文本文件,( j B7 F) ~7 U3 U
这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
7 W* ^" M: D6 O: D0 J# O2 _这个函数的优点在于不用先fopen,也省了fclose了。
6 n+ l' w( x+ t, f( U详情参见 matlab help 2. fscanf
( z, @# O2 r5 _, R" JA = fscanf(fid, format)
# n0 {6 s4 j. [3 \9 j" N[A,count] = fscanf(fid, format, size)
- V( p/ q+ O7 u. E7 f3 D无size域时或者size=inf时,读出整个文件 注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量
0 o& _/ D* H8 O' A如果只有部分格式符合,则只有符合的部分被读出,然后停止
8 R3 O/ I9 o- N) g$ r, R注意 %i 格式 Defaults to base 10 integers. Data starting with 0 is read as base 8. % {2 f; I# R$ J, b6 C* V
Data starting with 0x or 0X is read as base 16.
1 s0 x5 C/ m" ]/ [9 v6 p/ Q' H! M当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。
+ s4 C$ U0 c# C. T6 ?0 J9 z# m+ j注意,当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.
2 I6 K3 ^3 t$ W/ K) N" m J, j& |尚未用过 : n( V" y. y8 P7 b
3. fread
% l( H" B* _; ^6 wA = fread(fid)
; u' f( N; }8 VA = fread(fid, count)/ {2 H+ g9 o' [2 U) P. u
A = fread(fid, count, precision)5 L1 Q$ L4 s. O8 t% X( y j0 h
A = fread(fid, count, precision, skip)+ O& a; n0 b9 e7 ]. N/ r
A = fread(fid, count, precision, skip, machineformat)
1 a4 L2 ^5 ]: E$ c读取二进制文件
7 ?4 m& d) r9 n" h, K K不指定count,则读到文件结尾6 t" ]9 p$ q- z% Z0 ?8 H6 x5 w
不指定format,默认uint8
1 L+ n, F* P" g: z) |默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式" Y/ G$ r, e4 H4 B/ }: v" B# J K4 g
内建pointer会记录当前读取位置,以备下次从该位置开始继续读取 H$ J: a2 _; H8 ~
还有skip 若干比特的功能,尚未用过 4. fprintf. F L4 Q9 w3 ?0 C Z0 D% v
count = fprintf(fid, format, A, ...) 如果没有指定fid,则可以用来屏幕显示字符串
, L2 e- r3 M7 P9 h' Q- p注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
0 ~8 o, r0 q0 g/ m. }' x: d如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印) k" [' S( B* T
for m=1:length(A)% X b4 M! [6 l* x% e
fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;% G' z' J' n0 C5 b+ I
end %d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。2 A- @, W; U8 _4 N. n
%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果 测试方法如下: fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1)); 所以要看数据的范围,选择合适的打印方式 不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。$ f* p6 b3 Q( ~4 z- c* o
而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况 if abs(x)< 2^31
2 {! |5 R+ {- D7 A* X4 E fprintf(fid,'%d', x);
2 E& | \4 ]" W# Q elseif x >= 2^31
( U! L' ~% r# `1 X% ~: [$ \$ G; |; D fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));
& l6 o/ j0 x+ |2 m. I! y, \ elseif x <= -2^31
0 k3 A9 U* r) M+ K! v9 m fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));
8 q4 h- W. R5 j+ h" I9 F( C3 ], Q end
5 C2 J* N X( i& B' J9 Gfopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制 5. textscan ! N7 J- f! }+ f5 R9 I3 \
6. fgetl ftell 7. fwrite + S" S/ O$ ~! k7 q$ b
0 y4 S, }3 u: `/ i6 Q. v3 h |