EDA365电子论坛网
标题: matlab 文件读写笔记 [打印本页]
作者: cat12620 时间: 2018-9-17 19:08
标题: matlab 文件读写笔记
matlab文件读写
1. textread
" v5 O5 B. k7 X1 q最常用的方式 [A,B,C,...] = textread('filename','format')
' a) f% c( J3 [/ }, ]这样可以直接将文件的内容全部读出,按顺序依次放入相应变量中,得到向量结果
如果文件太大,则一则读出时间太长,二则memory可能受不了,可以指定读出N个数据,N<0 则读出整个文件
. x7 s& Q% {- h9 V s5 v% Q[A,B,C,...] = textread('filename','format',N)5 w7 Q# i4 m9 G d8 E& Q
文件mydata.dat是
3 `' I: ]2 @2 I h3 v8 Q( k, Y* zSally Type1 12.34 45 Yes1 T) ]! K* j! O0 X1 K2 e! b
[names, typenum, x, y, answer] = textread('mydata.dat','%s Type%d %f %d %s', 1)
该函数还支持更加结构化参数化的读取方式
" A% @4 R1 s5 D. Z) { C& L[...] = textread(...,'param','value',...) y0 [' m/ u4 }! T/ ^4 a
其中value 一一对应于param1 s/ D d2 t" y! C( t
文件data.csv是
0 C- N5 |: @. A2 J6 v+ v% ]. \1,2,3,4,,61 E }5 k6 W7 P
7,8,9,,11,12
0 j( _; y* d( W+ I V) w用NaN填充空单元:
$ n$ b% y3 Z w% }. Ddata = textread('data.csv', '', 'delimiter', ',', 'emptyvalue', NaN);
& X9 S7 C6 ` J4 `3 ?, Sile = textread('fft.m', '%s', 'delimiter', '\n', 'whitespace', '');
注意,正如该函数的名字所指出的,他只能读取文本文件,
/ N5 o2 T) ]) d这个函数在已知文件格式时非常方便,但一旦遇到各式不符,就会停止
. U! k/ T5 M+ M0 p这个函数的优点在于不用先fopen,也省了fclose了。
3 d H% r4 O1 o8 z1 |3 Q2 h详情参见 matlab help
2. fscanf1 P8 |/ I3 R# x; I2 b/ _: q& x
A = fscanf(fid, format)
1 Q: e! M% T7 l$ W6 I! Y5 j( A: m9 G8 Z[A,count] = fscanf(fid, format, size); t. ]+ k8 M. C# y! r$ f4 ?% [
无size域时或者size=inf时,读出整个文件
注意,此函数读取数据时,并不是把不同的数据放在单独的向量内,而是统一放在一个列向量中,这样,当读取多于一个量时,需要按结构取相应的数据得到每个变量
. B$ ]) Z) Q" ~( _* W. m如果只有部分格式符合,则只有符合的部分被读出,然后停止
' Y; H/ U) v% A2 x; ]5 v3 x8 F注意 %i 格式 Defaults to base 10 integers. Data starting with 0 is read as base 8.
1 C+ l8 h1 I! ~6 O, T- r+ o Data starting with 0x or 0X is read as base 16.
6 J# L6 t. f8 r0 F4 G当读取的数据既有数字又有字符时,则统一以数据形式存储,字符被转化成其相应的数字ASCII。' }) u3 ~' p7 x8 A8 ]
注意,当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.& c9 ^1 A8 {) c2 | r" J
尚未用过
5 y2 r6 @" b! ?& u3 d! j
3. fread# T- d$ T# g3 O; P' H
A = fread(fid)
4 ^- Z8 o( W2 C$ m$ ]0 A4 CA = fread(fid, count)
0 P. e M1 U0 wA = fread(fid, count, precision)3 L4 d, x. a' h& n
A = fread(fid, count, precision, skip)
3 |2 w+ s3 q* F1 Y- oA = fread(fid, count, precision, skip, machineformat)
! o! ^# _0 c7 E读取二进制文件
8 F$ u: r0 l4 Q不指定count,则读到文件结尾4 I$ c* ?( q+ |' ]: H
不指定format,默认uint84 q) Q& s( D) i- Y
默认返回double格式, 'unit8=>char' 以uint8格式读取,强制转换为char格式8 j1 g6 X5 }' h
内建pointer会记录当前读取位置,以备下次从该位置开始继续读取+ |# P1 t5 I+ q6 _' U
还有skip 若干比特的功能,尚未用过
4. fprintf
" ?; S4 r* F; w, O8 {6 t' @count = fprintf(fid, format, A, ...)
如果没有指定fid,则可以用来屏幕显示字符串( A' s' K0 o/ T& o1 S( w1 I- W
注意,如果A是个向量,而没有指定其index,则会将A从头至尾打印完,再打印后面的数据9 k" G+ g" z1 P# @" i$ v6 y( ~
如 fprintf(fid, '%d %d\n', real(A),imag(A)) 会先打印A的实部,每行2个,完成后再打印其虚部,所以要想每行一次打印一个实部和虚部的话,要指定index,用for 循环打印3 @ d) S- H& S! @# m* ]
for m=1:length(A)* b# O/ S% W/ I6 \
fprintf(fid, '%d %d\n', real(A(m)),imag(A(m))) ;
5 C5 {- v1 G7 aend
%d方式打印大于2^31-1的数字 以及小于 -2^31的数字时,自动转化用科学计数法的方式打印,即 %e 的方式,%i的行为与%d相同。
% i, c K2 p7 z%u 支持最大到2^32-1不用科学计数法打印, 但是用%u 打印任何负数都得到科学计数结果
测试方法如下:
fprintf(fid,'%d\t%u\t%i',ones(1,3)*(2^31-1));
所以要看数据的范围,选择合适的打印方式
不过如果超过32位,似乎已经没有办法不用科学计数法了。可能不得不用拼接的方式打印。2 P! C0 A& V* a$ V9 J4 A! O i- V7 G- O, u
而拼接的话,需要主要把位数打印完全,如选择低4位一组,%04d限定打印4位,保留高位的0.还要注意拼接要分正负情况
if abs(x)< 2^31
6 {* l$ }( `( z/ X- \7 n8 S fprintf(fid,'%d', x);
! c. L& C& K0 V1 v. d8 S% H& H elseif x >= 2^31
: V3 i+ K1 W+ V2 [4 o fprintf(fid,'%d%05d',floor(x/100000),mod(x,100000));
7 P& _6 h1 r5 a% \ elseif x <= -2^31- J- I' w# M* K/ g# V0 D% Z5 S
fprintf(fid,'%d%05d',floor(x/100000)+1,mod(abs(x),100000));+ c* c: q& |% N0 ~0 {
end
9 J, q4 D. u c# p, ~fopen文件时,对于二进制文件,不能用 rt 的方式打开,因为这样,文件中的某些数值会被当做ascii字符而被忽略掉,导致数据丢失
format long g 以非二进制方式显示,而且不受小于32位的限制
5. textscan
% H2 P7 N9 M6 L$ G0 R6 P
6. fgetl ftell
7. fwrite
; k6 g4 u; }6 Z( U, b3 U
% i7 j7 a. ?8 `6 r+ j4 X. P& y
作者: cj223356 时间: 2018-9-20 10:33
谢分享
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |