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

matlab 文件读写笔记

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
matlab文件读写
1. textread + F/ ?" j+ v( D7 u
最常用的方式 [A,B,C,...] = textread('filename','format')
' U2 \) E7 v3 V, V2 b) P( ]+ L7 F这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果
如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件
* N% `; @' G0 ^% `3 b" m[A,B,C,...] = textread('filename','format',N)
/ n9 p. }9 m3 T' z# n! [+ f文件mydata.dat是8 v% M6 c: l' c2 G% g7 Y. J" K
Sally    Type1 12.34 45 Yes
( ~, f$ L( c% k+ k, b5 R3 A[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1)
该函数还支持更加结构化参数化的读取方式
3 _" H6 s8 b% \. a+ B[...] = textread(...,'param','value',...) & m' n) y) [0 E5 K6 G2 w
其中value 一一对应于param# `; r: l! m. D5 Y& e% D1 {7 \4 {
文件data.csv是& n! {+ P: p( V- p
1,2,3,4,,6# z% T9 B* u7 g5 H; ]
7,8,9,,11,123 E% y9 j& D  T: y
用NaN填充空单元:
, R, h) G2 b/ o0 V* b  Wdata = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);
0 r" E! ?* z1 l3 @ile  = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', '');
注意,正如该函数的名字所指出的,他只能读取文本文件,
. w  U4 L9 G7 |4 h. X+ {: y这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
5 Y! @; p8 Z) s这个函数的优点在于不用先fopen,也省了fclose了。& H1 l, p* H; [: Y1 J6 ?. X8 P
详情参见 matlab help
2. fscanf5 y- I) Y5 s4 s. N  @& U
A = fscanf(fid, format)
2 ~' e8 ~9 f' w[A,count] = fscanf(fid, format, size): }9 S" y' Y3 U4 V1 n! R
无size域时或者size=inf时,读出整个文件
注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量

. K! j0 H, |% x  g  x+ D如果只有部分格式符合,则只有符合的部分被读出,然后停止) ]3 [' n$ d7 e) s5 T1 a# o+ x
注意 %i 格式  Defaults to base 10 integers. Data starting with 0 is read as base 8. 9 z  ?6 ~% ~1 G) c5 j+ ~; u" Z
  Data starting with 0x or 0X is read as base 16.# G) P: g( n0 M& E, ^0 H/ O
当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。. U; f0 g0 W$ ]3 f4 U& ?# a
注意,当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.
- h% e$ Z; O/ G% h  k4 L1 X尚未用过
' `1 u$ x5 G% v) I
3. fread
4 {  x* Q9 B; p  ~  @# z2 W  [1 AA = fread(fid)
  T. w  C1 J+ x9 d# Q* M; h+ K3 [A = fread(fid, count)
4 S. ?3 Z* N( t: ]9 z! rA = fread(fid, count, precision)
- W$ Y2 y) S+ o0 y6 NA = fread(fid, count, precision, skip)" Z: g0 Z' x) T. K
A = fread(fid, count, precision, skip, machineformat), k1 X3 g8 \! D* t
读取二进制文件: `. Y1 S$ r9 b6 k8 L
不指定count,则读到文件结尾
# d9 T  P/ n2 {- U& G$ X不指定format,默认uint8
% I1 f8 x& Y) ]默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式9 c( p. k1 L4 G, P3 I# h3 q* P
内建pointer会记录当前读取位置,以备下次从该位置开始继续读取
; E2 z) s# R' c1 [! D还有skip 若干比特的功能,尚未用过
4. fprintf
5 s+ G: V6 i: u4 Y% Ycount = fprintf(fid, format, A, ...)
如果没有指定fid,则可以用来屏幕显示字符串
! L5 h  l! Q7 J* j+ J" T注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
3 R: A2 {) Q/ t1 m( A6 _如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印0 z% r* w: q6 j) Q$ G4 y' g) [8 ^
for m=1:length(A)9 B& g: X' V$ |" s
   fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;' r* |5 G0 }8 }' ?5 x) o0 U8 X
end
%d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。" O2 m- [8 Q0 Y( [
%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果
测试方法如下:
fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1));
所以要看数据的范围,选择合适的打印方式
不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。& D) d6 ?4 Y& O% c  g
而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况
   if abs(x)< 2^31
1 v3 m  r* l, y/ z- T3 r      fprintf(fid,'%d', x);
9 e3 {. t- w, H: [   elseif  x >= 2^31
; b) C4 a2 `. C6 c       fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));9 N1 v; z2 `* D, J
   elseif x <= -2^31
: J# L1 g0 N$ N& d8 [% _1 V! z       fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));
* Y) D- f: F2 X; p   end
5 u, a8 j; U# ~8 O$ `3 H7 G! K! R/ U& @
fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制
5. textscan

% q* _6 f$ y& M6 ^4 @' r2 p! g
6. fgetl ftell
7. fwrite
; H* P  ~( V# O& f" T

* X7 K2 R' T; U2 ~" d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 00:57 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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