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

matlab 文件读写笔记

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
matlab文件读写
1. textread 1 a5 Q( q3 b* f: S1 g( `; f. o9 f; t
最常用的方式 [A,B,C,...] = textread('filename','format')% G6 s  W1 z& ^
这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果
如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件, [5 [2 |: }: S' `! k6 A% l
[A,B,C,...] = textread('filename','format',N)
2 d# j" ^0 ^, D( E! Y2 |: P文件mydata.dat是1 R! L; E3 Z! T% v3 Z0 f
Sally    Type1 12.34 45 Yes
; r5 u) {$ L% S! r+ e0 v[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1)
该函数还支持更加结构化参数化的读取方式$ I6 W. S% G( }6 u* d
[...] = textread(...,'param','value',...)
* \1 A- |" |4 w$ g$ K其中value 一一对应于param
  ]9 t" P6 N/ l" r- U! ]% G文件data.csv是
: g; d3 M! d$ g/ u1,2,3,4,,6
8 u+ r  S: \/ l7,8,9,,11,128 e# ~4 _8 i. K; g1 h! b  F
用NaN填充空单元:4 c$ H1 Q: r; K
data = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);
0 k' i6 A& E" r) dile  = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', '');
注意,正如该函数的名字所指出的,他只能读取文本文件,: I; E4 ?3 d% R- q8 ^. q
这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止" a( ?+ y& J! |& o* K; c% b% m( p
这个函数的优点在于不用先fopen,也省了fclose了。
, }( k* T) D$ i+ i7 _5 l详情参见 matlab help
2. fscanf6 q6 o. Z/ o( u9 G2 }! o) ~; l7 b
A = fscanf(fid, format)
- ]; X) t) J1 @7 D. K! Y[A,count] = fscanf(fid, format, size)( C# \2 y4 I% u+ }$ q' y; u
无size域时或者size=inf时,读出整个文件
注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量

9 p6 k( `9 }9 K+ m+ T- \如果只有部分格式符合,则只有符合的部分被读出,然后停止
+ V) m( v% ?9 q注意 %i 格式  Defaults to base 10 integers. Data starting with 0 is read as base 8.
) o4 Q" {  ?; z3 {' M% w! z  Data starting with 0x or 0X is read as base 16.5 i. F4 @  V: u: U0 ]2 v
当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。
9 E0 \) J0 q6 F# Y- K; K注意,当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.
1 |; }9 p) r) P5 A尚未用过

9 z9 L3 i% {  l! T4 g- r3. fread- F$ M8 K! c3 r" r5 l
A = fread(fid)- c( ^4 v- J9 Y! C: O& r# E
A = fread(fid, count)
0 ?. K, t& r9 U: i/ yA = fread(fid, count, precision)
9 t; E2 J" r  [  ?$ BA = fread(fid, count, precision, skip)# B- b% J5 @" Y4 ?( W) d
A = fread(fid, count, precision, skip, machineformat)6 f" q/ J- U; a0 z
读取二进制文件
. X6 f8 B  P/ k) g不指定count,则读到文件结尾
5 }  {& ?( w; Q4 e& W6 Z  S  c不指定format,默认uint8" \4 i4 [3 o! s: _3 h* Z, N# l) c
默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式
6 N% D0 r# g+ @# u5 a内建pointer会记录当前读取位置,以备下次从该位置开始继续读取  |5 E0 v* B% S
还有skip 若干比特的功能,尚未用过
4. fprintf
/ C: X' k9 R$ ^# J4 icount = fprintf(fid, format, A, ...)
如果没有指定fid,则可以用来屏幕显示字符串
/ ~" C* k4 T; ?' ^9 o, Z! T& \0 o' x注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据) Q) X3 f7 `& a* D3 Q% m3 Z% O" g; [
如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印2 i3 B% K2 u8 X: A% V) t% ^9 H
for m=1:length(A)
; o4 P7 r0 ~, s- O   fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;
2 U9 u: e; d7 r7 z: rend
%d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。
+ d, K" {' d& i' R( g5 d' o) B%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果
测试方法如下:
fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1));
所以要看数据的范围,选择合适的打印方式
不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。
+ O) g! D3 X1 `+ a3 W: Z而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况
   if abs(x)< 2^312 R0 \% d5 G# S% p
      fprintf(fid,'%d', x);* n% M) U" B/ \8 [0 X
   elseif  x >= 2^31
& f3 w7 m. M7 Z# u) B$ ?       fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));
. }2 s; B9 @; {* S4 h8 I   elseif x <= -2^31( [, ?% N" ~9 h" A
       fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));+ |) P+ p, y& T9 {6 u$ V5 h
   end
! [- C& e$ d6 T
fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制
5. textscan

1 u  m& R& Y+ t
6. fgetl ftell
7. fwrite

) Y# f: t5 `. \5 x8 U% u' q" Y- M) f2 S
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 11:21 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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