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

matlab 文件读写笔记

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
matlab文件读写
1. textread 8 X5 v  Q" `* I$ _1 l
最常用的方式 [A,B,C,...] = textread('filename','format')
* w8 a* z, `! P$ `这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果
如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件
0 O9 r' k1 H; T% b1 j$ {3 j[A,B,C,...] = textread('filename','format',N)( V) V$ K  U; R+ E
文件mydata.dat是) x% l0 @4 Q2 h0 s) P7 V
Sally    Type1 12.34 45 Yes
) h- O( V. J" A: X  Z[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1)
该函数还支持更加结构化参数化的读取方式+ O3 w; [4 _8 l3 I; ^  N
[...] = textread(...,'param','value',...) ; q! ~  b& B* J  }
其中value 一一对应于param4 W+ R% F  O+ K
文件data.csv是
6 G2 }; _& Z6 u$ p. |( n& J1,2,3,4,,6
& Z# {) g" V/ r3 a7,8,9,,11,12& Y8 E( N) @! o2 c" J  R3 f
用NaN填充空单元:8 r3 H5 W# N  F) T# ~# Q
data = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);
% _5 B" l: d0 P9 ~: kile  = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', '');
注意,正如该函数的名字所指出的,他只能读取文本文件,& _$ d" a* Z# o, R
这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
1 x% P- j; E0 k- W- B6 _这个函数的优点在于不用先fopen,也省了fclose了。( U2 Q6 v' e) x' ^
详情参见 matlab help
2. fscanf/ B" n( \/ X# b+ l! x
A = fscanf(fid, format)
% O1 U8 b& ?1 y% N* |: ~+ `[A,count] = fscanf(fid, format, size)
" i0 w$ {2 j3 U" T/ h$ c无size域时或者size=inf时,读出整个文件
注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量

7 A) E  ~/ ]% U  }" I4 @如果只有部分格式符合,则只有符合的部分被读出,然后停止
" ]5 Q/ L# @& W注意 %i 格式  Defaults to base 10 integers. Data starting with 0 is read as base 8. 6 P' l! m. D- Z" o8 a
  Data starting with 0x or 0X is read as base 16.
# y- m+ b# g: q9 ^& Z当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。
" e! R7 r8 I( m: r" n2 l注意,当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.
. m' ?' v( x" D2 B/ J$ d尚未用过
6 I$ ~! l0 I3 |* {
3. fread
. a5 z# E7 G4 k/ ]8 }, sA = fread(fid)/ o( c1 {2 r  s  g, Y
A = fread(fid, count)
0 P( A( W4 O1 ?  r- dA = fread(fid, count, precision)  \7 G8 k' _% p
A = fread(fid, count, precision, skip)( Y* p6 C9 W7 N
A = fread(fid, count, precision, skip, machineformat)7 [) m/ Q& J8 ~
读取二进制文件. S  {0 A4 h% h5 q
不指定count,则读到文件结尾6 A2 \, C- K$ K3 l$ v5 u+ F" P
不指定format,默认uint8
* Y/ V0 Z- k; G- U: Z默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式
) P) M) X3 `1 ~$ _0 h3 \内建pointer会记录当前读取位置,以备下次从该位置开始继续读取
) z- h2 i1 s& I. ?1 s还有skip 若干比特的功能,尚未用过
4. fprintf+ h, d% t6 ~4 d+ P6 r* J4 k
count = fprintf(fid, format, A, ...)
如果没有指定fid,则可以用来屏幕显示字符串) n& [2 p* x: J' Z1 p7 Y: ?; i/ S
注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据
1 g  @, U, v1 q. h( T如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印
) b2 {! @# L( z7 F& m- Kfor m=1:length(A)
  V: M5 m7 r6 H   fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;
% t8 D: X5 s3 h/ Z, S6 ]end
%d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。7 |; |$ d7 V7 w% \3 p% d9 \
%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果
测试方法如下:
fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1));
所以要看数据的范围,选择合适的打印方式
不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。
; W) j! i* q, L7 ^# J而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况
   if abs(x)< 2^31
( `6 a1 q9 X" S$ s$ J0 D      fprintf(fid,'%d', x);
: m1 \) E! X) i& X7 Y4 R% y   elseif  x >= 2^31
4 O4 J# R' M8 v8 l) g       fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));+ V; i$ t# _9 u/ P
   elseif x <= -2^31! T2 x. o# I- a* S1 A
       fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));
# T" u/ ?# ]1 e3 R9 y* T4 K   end
6 C, G' E4 ], G* k- Z& W% m
fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制
5. textscan
! |' x, [/ X% {4 {1 g
6. fgetl ftell
7. fwrite
) G- u3 y  v" R' g) [

0 ?( o7 p0 |) v# C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 17:20 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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