找回密码
 注册
关于网站域名变更的通知
查看: 558|回复: 1
打印 上一主题 下一主题

matlab 文件读写笔记

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-9-17 19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
matlab文件读写
1. textread
! G5 R) |; T( F$ O1 ~2 t, ~# ~4 M0 \# X最常用的方式 [A,B,C,...] = textread('filename','format'), X: u, s2 b7 w( i6 x7 h% s
这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果
如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件5 U3 d2 |- q5 w) }2 i
[A,B,C,...] = textread('filename','format',N)
9 h5 ^( {" D- p1 N/ k" t文件mydata.dat是; z& A5 l& z  y5 b
Sally    Type1 12.34 45 Yes
: n2 f0 a9 G% a4 i2 X* A; R. I# X[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1)
该函数还支持更加结构化参数化的读取方式! W' E) F0 `# c- M
[...] = textread(...,'param','value',...) - D+ [, ~- n/ b, `: v, @+ N
其中value 一一对应于param( O2 b& Q$ u  _: n" p  U0 f
文件data.csv是# z, X  j5 k9 N) y
1,2,3,4,,6
. l8 L& {+ p1 \, i, W7,8,9,,11,129 @6 g4 h0 t8 O- l8 B1 Z& H- w
用NaN填充空单元:/ H: n/ _' N1 |  x2 X
data = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);" ~$ G# m# u2 M4 L# R& I
ile  = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', '');
注意,正如该函数的名字所指出的,他只能读取文本文件,
+ X8 H3 W# l$ P9 }! k这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
: j# H+ O! l' y这个函数的优点在于不用先fopen,也省了fclose了。8 L! u( u+ i( M5 s
详情参见 matlab help
2. fscanf
5 v8 g+ L. s9 o3 w6 G3 P& [A = fscanf(fid, format)2 K  Y: `5 i- k6 A
[A,count] = fscanf(fid, format, size)
9 Q6 O+ t2 B6 }" k& j无size域时或者size=inf时,读出整个文件
注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量

+ }+ C6 e/ u' h& f如果只有部分格式符合,则只有符合的部分被读出,然后停止* M: f" l  d2 {( K4 z. c; x
注意 %i 格式  Defaults to base 10 integers. Data starting with 0 is read as base 8. 6 Z3 z1 i* n+ h* _( G% P( j3 g
  Data starting with 0x or 0X is read as base 16.  j) U+ S' q6 m2 m1 y
当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。1 r* r! o" {; q6 ~1 W+ i8 q
注意,当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.
( i8 q& ?+ _5 {1 \% Y$ h尚未用过

' a  E+ J4 e- d2 I2 y- P* E3. fread
. U3 S$ r' B3 X( vA = fread(fid)3 b. j: d) o5 }1 Z5 f
A = fread(fid, count)' L$ \4 c" |7 g/ l' ?- I, n
A = fread(fid, count, precision)9 j* k0 }: I$ M8 F- J
A = fread(fid, count, precision, skip)) A( s  A6 I: z; x! Y
A = fread(fid, count, precision, skip, machineformat)  o5 C+ _+ [- Y" N, g: V. B
读取二进制文件
$ j6 d, q4 v6 T9 w7 O: w3 [3 E不指定count,则读到文件结尾
# E: p4 {! Z0 u8 v/ I4 x不指定format,默认uint8/ @: f$ X3 A4 H& U; j- E! O
默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式
+ o. L8 c2 q5 {- A7 P& s内建pointer会记录当前读取位置,以备下次从该位置开始继续读取. H3 o# [' D8 s/ b" @( \) O( Y+ r6 {
还有skip 若干比特的功能,尚未用过
4. fprintf
- y( a+ [  P) [9 `count = fprintf(fid, format, A, ...)
如果没有指定fid,则可以用来屏幕显示字符串
) w! \9 q5 c, Y1 w0 k. O" X注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
  E+ u5 _0 _' V: e( x1 E如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印1 b/ \0 m+ D; ^( ~3 Y( }& U
for m=1:length(A)
1 X0 k3 ~' L1 Z: m2 I   fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;! @! p! J, V+ ~: w5 W% ]
end
%d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。
+ O& c7 z: e/ M# P%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果
测试方法如下:
fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1));
所以要看数据的范围,选择合适的打印方式
不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。3 ~  q1 z# R9 N, M5 e* _
而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况
   if abs(x)< 2^319 p, X/ ]: C  e$ t
      fprintf(fid,'%d', x);
& X$ Y$ Z6 I& J9 I" F4 m4 _# m   elseif  x >= 2^31' h% ~8 b. r. k& [+ a- l
       fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));& i% W: j7 q* D9 S( e& K
   elseif x <= -2^312 r+ B" N- \, j2 c' E! T! b) V  m
       fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));
0 W" t( I" X" H   end

9 z) X# H# {# i6 {& b2 hfopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制
5. textscan
% n* Y: r& d- ~( S  e2 }
6. fgetl ftell
7. fwrite
! U# ?) x8 N; P6 C  s- O
8 U. A- n3 E# u3 r5 y+ _. Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-4 15:17 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表