- 在线时间
- 5024 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2009-4-8
- 听众数
- 738
- 收听数
- 1
- 能力
- 23 分
- 体力
- 77273 点
- 威望
- 96 点
- 阅读权限
- 255
- 积分
- 27108
- 相册
- 1
- 日志
- 14
- 记录
- 36
- 帖子
- 4293
- 主题
- 1341
- 精华
- 15
- 分享
- 16
- 好友
- 1975

数学中国总编辑
TA的每日心情 | 衰 2016-11-18 10:46 |
|---|
签到天数: 206 天 [LV.7]常住居民III 超级版主
群组: 2011年第一期数学建模 群组: 第一期sas基础实训课堂 群组: 第二届数模基础实训 群组: 2012第二期MCM/ICM优秀 群组: MCM优秀论文解析专题 |
5#
发表于 2010-6-6 21:54
|只看该作者
|
|邮箱已经成功绑定
回复 lcn413 的帖子( X( Z4 w4 `7 G5 z; O
9 t: g2 a5 N( Z" ]
" c* }: l: z2 l: g 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。
* Z" y3 c% R1 [2 I5 x- x! d% R5 |! p. S( r- i$ {! x
13.1 数据基本操作
; G% k! j) e$ t4 W6 w 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。
* b: U% ?9 C F* j7 \: ^7 @13.1.1 文件的存储
5 t$ d% e* ^$ W* \/ d9 L MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。4 m- Y5 d! B, _" w. h
1. 保存整个工作区4 q; u7 P. D/ Q/ w* m, L3 G
选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
0 H: O7 P6 p2 \ 2. 保存工作区中的变量6 o) \% _; n1 U, [5 A
在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。3 f* ~7 T! l$ g" N: M
3. 利用save命令保存
) K' n5 I% _: d' y6 g$ S 该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:
# `# w8 u0 W7 ]1 e2 U M● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。4 O5 G% x' }' P# D4 B
● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。) X5 P- N. ] Q+ V0 b: L& }
● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。, n" o% \ m7 q$ a: K# L6 Q* Y4 N& l) E
● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。" v8 J4 C" A5 J: F
● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
) m# I, J6 F; @: o& o● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。2 F: v7 |) @. y; e
● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。# b* W4 d6 L+ X# W" {+ Z3 Z- r+ {7 q
13.1.2 数据导入
7 F- ]7 G% _9 s, E MATLAB中导入数据通常由函数load实现,该函数的用法如下:
) f0 Y E0 @2 I● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。; o1 O. I+ ]* @1 v( L
● load filename:将filename中的全部变量导入到工作区中。; O' j, O& U2 n: k+ @
● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。; y* h% g' }) u" n! S4 X" w/ q
● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
" G3 I% C3 ]8 Y7 ^" M) v7 p6 n: f● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。! U. M% F$ _" B! g6 A
● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。& a! n& g. R! [0 q
例13-1 将文件matlab.map中的变量导入到工作区中。+ R' S E- U5 d1 q
首先应用命令whos –file查看该文件中的内容:) C) R h* y2 x% z/ X
>> whos -file matlab.mat: `. N$ h. E9 M! y! ^/ ]
Name Size Bytes Class
. c6 d L. Y% ]* w% }) \2 Q1 U A 2x3 48 double array+ o3 V, s! K/ V2 Q8 E: j
I_q 415x552x3 687240 uint8 array0 u' p3 F/ r5 _/ \6 A5 f
ans 1x3 24 double array
, h0 J5 }* @# S- s num_of_cluster 1x1 8 double array) o( n; t4 h+ T& I3 G' L# w
Grand total is 687250 elements using 687320 bytes
" V4 ?5 o1 J4 q. X 将该文件中的变量导入到工作区中:
6 b8 W( i& D, B. l, j. O >> load matlab.mat
" I. x* S T& a* m" O) o$ I 该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。: t0 X1 I3 p8 f, f' Z, P
" A0 t3 U, P1 l* {6 S. x$ W
图13-1 导入变量后的工作区视图: ~4 ~0 F8 X i* k% N# ~
接下来用户可以访问这些变量。, H. W' R% e! R0 L. B
>> num_of_cluster; Q* ?, R, ^: |6 U5 b. m* l( k
num_of_cluster =/ s/ m8 ~# w" K$ D9 l3 `9 y3 m
3& F! {8 w: v' ]+ x
MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:
8 f) |, g0 ?4 y: f% W- ]4 W% C● importdata('filename'),将filename中的数据导入到工作区中;
1 F; ?; z* B: b1 t" ^● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;
% A9 I: l1 v' a/ {/ D● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;) P* f5 u) b8 x4 f4 `' p" i
例13-2 从文件中导入数据。: l/ O% y' N/ {/ h# z
>> imported_data = importdata('matlab.mat')& U$ V8 w; Y6 J9 f4 a* o' E
imported_data =
+ `# C( Z2 M+ C3 M: @7 F ans: [1.1813 1.0928 1.6534]! z: o% v6 `# d+ O- T W6 \( f) k
A: [2x3 double]
' l5 J6 _& ~" X. m) `' e- g I_q: [415x552x3 uint8]2 M3 U6 b( T# z; n- z* ]
num_of_cluster: 30 ?4 O+ Z' Z+ M2 @
与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。
; Q2 U/ k. v8 z: B; \) V! K- m# Z13.1.3 文件的打开
$ c: ^3 ?1 o: w' g* G) G7 i/ R MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。# }9 I4 O* a" p! i) Q! K
需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。
2 N, C9 ?8 F* B% ~( O% y h, Z( f' \4 o' C! N4 e
例13-3 open与load的比较。
) V/ k) L6 L# M/ Z+ M >> clear6 {& h! D' N, ^* u
>> A = magic(3);
+ z& }+ I& j- w+ y >> B = rand(3);
5 N2 ^5 Q5 P- a( d/ F% W >> save
5 L; t: f6 K& _( E Saving to: matlab.mat' T2 R3 H/ I& X
>> clear/ {7 q/ p& [0 u. f4 d0 S
>> load('matlab.mat')# S4 s8 Y3 p7 @
>> A
) B0 [2 y7 f0 Z6 O& K A =
% j3 V- y8 a* j8 m" { 8 1 6
) o4 _0 z: {1 _6 }9 i 3 5 7" L0 c+ D' D* w& m& x- R6 J
4 9 2
; ]2 G$ G1 E7 O7 Y9 [ >> B
) T/ Z( m5 T6 \+ q B =- H2 `, S' g J2 c
0.9501 0.4860 0.4565
2 ?9 H" A7 f1 M 0.2311 0.8913 0.0185
# C; p! d, q0 d" M0 R C; ^7 m) j 0.6068 0.7621 0.8214
: l% l7 D6 C" B! Q2 G- ^9 u >> clear1 M/ ?' W! X, P5 C; U4 l
>> open('matlab.mat')
% z) k/ @* \( V ans = 5 z# k, ~( _& T1 T
A: [3x3 double]( C6 s+ z+ B6 Y, [, U4 e8 I
B: [3x3 double]
0 P! ~' `) v1 \" p6 d' S >> struc1=ans;
' ]3 J0 \2 J7 v: k9 a >> struc1.A
, L. ~1 _3 D& ?- ^ ans =/ X3 h3 U' m" Y: [0 |
8 1 6
* K0 N2 k9 k' l. U9 g 3 5 7
8 \: k; P# X3 M n 4 9 2& c% f4 y' q3 O3 p
>> struc1.B
z/ r% E0 m# b# \9 t+ O# F ans =
6 @8 o$ I+ T( l8 | 0.9501 0.4860 0.4565- i* o8 f* X7 _
0.2311 0.8913 0.0185
, e6 K4 u( i# |0 M. p6 f; W 0.6068 0.7621 0.8214$ u- L+ n( @" r+ M, U# q; u+ I
13.2 文本文件的读写* f! ^6 V+ N9 X) Z
在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
/ B* K' y- d9 M* V: L MATLAB中实现文本文件读写的函数如表13-1所示。8 P/ T% t9 _1 [+ |3 T% G
表13-1 MATLAB中文本文件读写函数! G9 X9 A7 ]3 ?' V6 X1 L
函 数
/ N, a; o: J" p" V8 ^0 Q功 能
s- B7 [9 I! e$ H l6 u$ Bcsvread
+ c" ?( k7 X8 s& `读入以逗号分隔的数据
0 m( U& \5 X6 `0 I2 Pcsvwrite, E4 U# g4 O: h
将数据写入文件,数据间以逗号分隔
6 q% c$ ^: [* v; O: Q6 h/ x# `) zdlmread
9 L1 n: h2 f/ r* K. f$ [将以 ASCII 码分隔的数值数据读入到矩阵中
7 [" ?6 I0 L! y3 Qdlmwrite$ X. K5 l$ V! z' P$ D
将矩阵数据写入到文件中,以 ASCII 分隔, p- x6 W+ Q, n" T$ w8 C+ g
textread
( k: L+ S$ o5 K# M从文本文件中读入数据,将结果分别保存
3 P8 m2 _7 ?0 v) n& G7 K c+ Ttextscan
' K6 d- N5 h0 D6 H从文本文件中读入数据,将结果保存为单元数组
# K( r' b0 Q$ ] 8 h. {, o& ]& w! K
下面详细介绍这些函数。0 |0 X* R- ^) V! w" b3 }8 R) K
1. csvread、csvwrite( U+ t2 j$ V$ t
csvread函数的调用格式如下:1 I' }" k4 E! m
● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。1 H, N: y- z8 C3 t4 s! H
● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。# _0 ^) u3 H, O7 W3 n/ Y. o; V' r
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。
# u" ?. b8 }' j. W csvwrite 函数的调用格式如下:
# @2 H9 k+ u1 j9 D/ H, |; \4 W4 Y3 E● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。
" m% }7 I2 ?3 E1 ]$ H- S● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。
2 P$ g: {7 b/ U# q$ Q. P/ q1 l% S● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。& \0 @: A) E. L: B5 O7 v
这两个函数的应用见下面的例子。
) K# `+ N5 Y, H9 f例13-4 函数csvread和csvwrite 的应用。! w2 c+ y. w* A' @7 k5 [1 Y! ~
本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。
9 p J1 a0 |! n( B" Z+ K8 `6 T 编写M文件,命名为immatlab.m,内容为: x# ]/ N4 p$ I/ Z
% the example of functions csvread and csvwrite4 x7 Q- e# l$ t3 A, G( B
I_MATLAB= imread('D:\matlab.bmp'); % read in the image. O: Y6 \. a" h7 z* I6 B8 q, h
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image. P. G/ V* c- o y" f4 V
figure,imshow(I_matlab,'InitialMagnification',100); % show the image
; p$ K& n/ _$ e# I5 k csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
/ A( @. q5 R7 ?- h& p2 F! M+ p+ H sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data2 F$ V4 e( t+ n$ V
sub_MATLAB= uint8(sub_matlab); % convert the data to uint8/ L) Q# f# M. a8 K$ l4 ]2 r" [
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image
$ Y/ I4 F! o. Y 在命令窗口中运行该脚本,输出图形如图13-2所示。
4 Q2 L* E' P5 S+ _! a
g' n9 E8 y9 i# X" X) Z' j(a) (b)
' ^" d* Q/ }/ @- D, l! _ n图13-2 例13-3 的运行结果2 X" D# i7 S* t, d
该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。
' M V, t$ ]* F* o1 G$ a; | 2. dlmread、dlmwrite(个人觉得这个比较好用)" \! {- E& m l' ~
dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:- k& f3 n' t+ R" N% W. U
● M = dlmread('filename')
& q) e/ x+ s4 Z" S- k● M = dlmread('filename', delimiter)
/ l ^# k2 x/ U! y4 e● M = dlmread('filename', delimiter, R, C)# [( ]% Z6 i; D/ @
● M = dlmread('filename', delimiter, range)
+ r c7 G( a& q. j6 [ 其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。
6 C# H, M: S5 E. g6 l1 P5 B. I dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:
6 N. z9 J* ?2 I( @; M% r& a● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。3 w3 |' e% i; _$ ]2 e ~) E( b
● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。
7 f7 g9 E* g( t# Y● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。
3 N7 ~0 G, Y& V8 o4 }3 z4 \● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。
" _- x# F$ }1 |, l1 P$ n' z● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。7 h3 p( @; F* l' v& u% m0 e
● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。
2 a) o7 q' }$ l1 ?● dlmwrite 函数的可用参数如表13-2所示。! G1 k G( r* @# O+ H" N
; b0 @5 g5 T: i5 _3 d' t
( t- i$ }( I/ b) R$ F表13-2 dlmwrite函数的可用参数
% u4 N$ t4 k6 d4 K& u7 _, _参 数 名
/ Q5 a& P& {/ z0 I' o$ j功 能
' v6 D! {& ~$ Tdelimiter8 ]9 P S4 Y" ?" p
用于指定分隔符% F x% m5 D E, q$ W1 x$ |: S
newline
: }/ t1 q5 J( r0 G用于指定换行符,可以选择“pc”或者“unix”/ m- \9 `3 C) t' B1 ~3 a2 C
roffset
" p: l8 H( X- ?) x3 w$ |行偏差,指定文件第一行的位置,roffset 的基数为 00 J% T% d5 B/ z$ s
coffset& p) K ^) X! a5 e9 ]
列偏差,指定文件第一列的位置,coffset 的基数为 0! |0 W4 p# j! }3 w" v. E2 u. E
precision3 a7 M+ J( i" ?! [3 c
指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”# A; w3 f" h0 C0 Y. I# ~0 W
* E& s# }$ P) b3 O' B% w' U 3. textread,textscan
9 Y* E6 N2 E, A9 [0 F3 i 当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。) e6 t* k- K# w2 D7 E; U* I0 t; Q( S
例13-5 通过%读入文件,按照原有格式读取。; n( T$ h4 E: C1 e. x
文件的内容为:! j$ h1 B: A& k- E% P
Sally Level1 12.34 45 Yes
9 U: W. s2 i2 W: I/ f在命令窗口中输入:9 P- n4 E0 D( H+ _3 M @+ w; G5 H7 B
>> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)& Z) w& L6 _; l9 Z# H! ^: X
得到结果为: F% z( T- k7 T9 ?' n( f& L
names = 6 H {2 Q7 x& r j' j, }
'Sally'4 t' S, `8 R% T9 D0 \% o5 m+ S
types =
0 p0 r$ e! E8 _1 e9 I0 Y& J 'Level1'
2 Z1 ?9 b( [. D( [- Y* h: ? x =
+ X4 a2 l5 d7 I3 T; W 12.3400
# S% G6 W u+ \; n+ N y =3 U: N* X1 q) g/ R& N- o/ f
45* ?* F0 U5 z: p, i. C
answer = ! u# a1 d4 W: S' J/ i
'Yes'& N7 l2 z+ [+ U+ m' T9 ~# e$ I. N
" o4 y& o8 n! k9 I2 [; ` ! B- v# z: c4 S" q& h" J8 F( K
例13-6 函数csvread和csvwrite的应用% K& `' l. I7 b7 U" N
Sally Level1 12.34 45 1.23e10 inf NaN Yes' I- t: M( W; H5 J, v9 x
Joe Level2 23.54 60 9e19 -inf 0.001 No- B# L) p3 K0 T' D+ [+ _: Q
Bill Level3 34.90 12 2e5 10 100 No5 Y* U! F& H; C3 r
>> fid = fopen('D:\mat.txt');
" M- ?/ ?4 ~& u6 { >> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');
2 y7 r" C6 w, o$ Q ?' I >> fclose(fid);) l4 b' j) a6 t, ^
13.3 低级文件I/O2 o) n. c! x M" U* p
本节介绍一些基本的文件操作,这些操作如表13-3所示。
- n4 y9 |" v0 l* l1 W9 ? _; [表13-3 MATLAB的基本文件操作9 w% a% o7 `& Q# e
函 数& O3 @0 A7 f, {! f7 j3 [- ^
功 能
' V5 \7 h, |+ {% ~& K fclose+ O7 n# X+ ~1 n
关闭打开的文件; i% {" F- I6 B% \% o4 t1 ], e
feof
. Q3 w2 S) C* J) U9 v$ O$ `判断是否为文件结尾& H& l) q# T& N9 p: K9 A8 r, a
ferror9 w+ C/ I3 |& B: F3 Z
文件输入输出中的错误查找
3 y' c P, b6 J5 G fgetl
; y# r, z, P' b0 A U& S4 W9 L5 f读入一行,忽略换行符
; U, a0 c+ Z. w% d' b fgets
- p! I6 f# m$ L) k4 ]* b读入一行,直到换行符# e& y: t# F/ P9 ^: `$ u
fopen
( s5 ^ a5 ~2 M$ J打开文件,或者获取打开文件的信息
5 f( ^% l" n- S" U fprintf3 c; t: u8 C6 u
格式化输入数据到文件4 n, T, V9 p U! I& G, D$ x3 i
fread
' x. R( J" ?+ S/ R+ O% T" I从文件中读取二进制数据
/ h( T) [2 Y) Y' a: R) K$ F frewind1 o3 l4 A( S9 @) p
将文件的位置指针移至文件开头位置
3 {& U! c1 ~! g3 D" d- b% a fscanf" _' c# B+ W& @( {" C
格式化读入
E8 }6 i" K$ g- P S5 u fseek& f+ @% R% O* ?4 x7 K7 s
设置文件位置指针8 u3 z3 |# q( u. k9 V
ftell% L% p) g8 x0 r" C% [
文件位置指针
; {( X) B6 s% ?- A( C fwrite5 c- Y: Q3 \6 z2 D, B( h
向文件中写入数据
, o1 J* `1 o# I+ G4 [# Y % P R5 S2 u1 R w" w
下面重点介绍函数fprintf。该函数的调用格式如下:' q+ t3 ?; J8 c [
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。0 o+ F/ D0 @7 m6 x
上面语句中,参数format由%开头,共可由4个部分组成,分别如下:8 B6 [; l1 N) N `8 N
● 标记(flag),为可选部分。
/ e# R2 X& R6 o4 h# d● 宽度和精度指示,为可选部分。9 a) t4 w# J2 R! @8 G& r% m7 M* _
● 类型标志符,为可选部分。8 B- u% m. u# O$ F0 Z
● 转换字符,为必需部分。
3 K0 o& c- ^. v8 Y) ~9 `# f1 R 1. 标记0 S |# q9 ^, n4 @
标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。
' @, V5 H. R+ g4 {4 x表13-4 标记的可选内容
! w8 Q5 A2 N8 F6 Q7 x函 数
9 }; x6 X) d/ V& H. I/ j功 能1 O) b4 W. [* R$ N& n0 F& y: W
示 例$ |' C2 N5 A' a
负号(-)
0 N% x5 c& p7 j5 D- Q; t; V) o6 t8 m 在参数左侧进行判别
, W4 N3 t9 j2 d0 V5 \8 q6 h9 k- h %-5.2d+ w6 A* }( N, ?* u+ F
加号(+)
' t. ], E9 x0 l" D7 O 在数字前添加符号
9 M0 A1 ~. [! X" T# V' q %+5.2d
+ T- a+ k5 _ \! e 空格
( u' ~# C9 s8 z, b+ V( B5 n 在数字前插入空格
! V: D/ x E1 Y* s* f" Z % 5.2d
& w5 C$ P8 h7 G7 E+ d 0& X: q7 L; v9 p A" u! f5 N4 I
在数字前插入0
9 ]7 J' {9 b1 k8 q, W$ Y* ?4 `4 | %05.2d
3 a% r9 w3 R, r( J# D5 U: f) N 2. 宽度和精度指示
[. N) |. i \4 P 用户可以通过数字指定输出数字的宽度及精度,格式如下:
. j# d3 M: i- @: x0 q● %6f,指定数字的宽度;+ ~# _3 T, Q6 Z. h
● %6.2f,指定数字的宽度及精度;
5 F! Z/ s0 I r4 Z! \● %.2f,指定数字的精度。" G0 I8 s b2 B* s. L3 ~* s
例13-6 fprintf函数宽度和精度指示符示例。
, P" q- {+ z- L9 O4 x9 B 在命令窗口中输入如下命令:
4 R: l. v% n8 }1 p8 g% p: p$ n) f >> file_type = fopen('D:\type.txt','w');+ v; [$ U1 \, y( |. K
>> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);$ O \0 l5 S" D5 E; A+ j4 ~/ A
>> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);# N0 @: K4 m; Z B. G2 n/ @+ I% w
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);
0 h; l& x( m' a" W+ Y( v/ ?# ? >> fclose(file_h): r* o7 a$ G5 C$ N
ans =
7 W8 u: H% J" r4 I 0, g) n6 v6 T: ^, C/ a
打开该文件,其内容为:' E {2 z& ]! `
1.20 -43.30000000
4 ?" ~/ A5 n3 H Z0 ]# O 1.200000 -43.3000004 K: s* _8 P' l9 I. c+ @, i
1.20 -43.30000000
7 I# o, z: F6 \: N" t$ T$ l) l: [. c 从上述结果可以看出宽度和精度控制的效果。
+ Q" n8 K. v+ g" a 3. 转换字符- M$ R, i% j9 T& R, l7 u
转换字符用于指定输出的符号,可以选择的内容如表13-5所示。# |' f$ }8 O+ ~ ~ e0 k$ S
表13-5 格式化输出的标志符及意义
- F" R& g; ]/ s$ b, E( m标 志 符
& n3 V$ l& m/ n( K意 义
5 @ }, C7 w0 L a# `$ P" u6 ^ %c' ~( `- c/ m& ^, A, q* y
输出单个字符
$ k! P- Q/ H1 A. _ %d
: S2 C9 q3 O. W! a! ~5 M输出有符号十进制数* ~0 f( F/ [4 i. C- n8 V4 c
%e
& b5 V. M+ b3 L采用指数格式输出,采用小写字母 e,如:3.1415e+00
2 Q9 D1 W0 r9 u/ o. g% {3 E(续表) 2 D5 I& a8 T- R c4 [# P1 X+ ]
标 志 符6 {5 ^* e& u4 r2 A
意 义
# e& N( K2 b# l* H- }8 s- | %E
j* T; B1 ^; u5 T7 k/ l7 J. F采用指数格式输出,采用大写字母 E,如:3.1415E+00' ?# |" ?# d6 q: p: n9 I: ^* z
%f
/ q* x( S) j4 m1 \+ k) B以定点数的格式输出
+ D2 H. G# _: F- q: U %g+ R- S* u5 d) P
%e及%f的更紧凑的格式,不显示数字中无效的 02 M4 J" H7 c3 ^7 @
%G
) u8 r# M+ \/ r+ Q与%g相同,但是使用大写字母E4 A- V9 P/ i' M E" a9 u' k0 M
%i/ T$ ^: [* [' F7 u5 @7 h
有符号十进制数6 h" L6 L9 |5 m/ a1 s7 K
%o: ?& {9 J7 Q+ }: f/ L) z1 `
无符号八进制数
( }5 c1 U) \, ]0 u* E; t %s( x! O8 N; z5 _8 R
输出字符串
6 F; T9 N: d B( d( u" l$ @! q %u
' _, S# K7 A( C/ R* J2 G无符号十进制数* f: M* a7 p. H# d
%x
' \- z8 w) [9 s: o T- `十六进制数(使用小写字母a-f)9 ]5 a/ O7 R2 o4 G7 m% i
%X8 o5 z( _5 l& H( r( ~5 j o( L
十六进制数(使用大写字母A-F)" V" i4 D( O- q% i- S3 J7 ^
, z# O' K5 B6 } M w& w: Q 其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。
+ [; v1 G d6 Q- g/ j" R) a2 o例13-7 fprintf 格式化输出示例。
: e4 r, ?8 _. a >> x = 0:.1:1;
* r+ A& ?7 A. c6 V' [9 P >> y = [x; exp(x)];
6 J/ Q) A. _+ T/ j7 J8 I% @ >> fid = fopen('exp.txt', 'wt');& k" q; \4 X) I5 ]! ?
>> fprintf(fid, '%6.2f %12.8f\n', y);
2 ? }- X9 A8 { >> fclose(fid)' Q9 h" h8 m- x; e
ans =
0 f+ q3 _6 n8 P! Y2 x: w 0
# `* ~; O( A5 p2 S( o; x' m( V 显示该文件:
4 K& y' y4 r" T/ _ >> type exp.txt n8 T' V$ @8 C! F8 x. P6 v
0.00 1.00000000- @; J* p5 I3 T- {
0.10 1.10517092
7 C' j6 u' a d2 H2 | …
1 r4 P T$ u) `1 R' D 0.90 2.45960311
) _1 v! q3 M4 [: Q 1.00 2.718281838 d3 R; m5 g6 F8 P, W* e
例13-9 利用 fprintf 函数在显示器上输出字符串( Z, T+ }2 h2 l! G3 ]
>> fprintf(1,'It''s Friday.\n'). P- O' P3 f) f, Q0 E' }
It's Friday.% f% a& r$ h m1 z7 U2 ]
在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。
- A G; V% M+ E: n/ Q( e% G& h: X - F; \* ?4 X0 N
" d" |- x/ j8 F9 b5 u表13-6 MATLAB中的常用转义符* h- O+ D( N0 ?8 |. F, G% a2 \
转 义 符
( ^4 f/ U( Y# Q/ b' k7 s/ E功 能
: y5 E ^- `' W" `0 ?2 l5 Q+ _ \3 I \b 退格
" U4 A3 L" e- f9 m \f 表格填充
( C( ~5 {9 P6 t% I | \n 换行符
: Z* \6 j; Z5 z' h+ X& Q0 | \r 回车, c7 J( R7 A; m& z
\t tab* y! c/ c1 x2 P3 ^" M$ I6 p: j& n6 K
\\ 反斜线
+ L, D( R& t! s$ ~9 I \'' 或 '' 单引号
% B; n3 r4 x0 v* q: M" ? %% 百分号* z2 i; N3 J5 {
13.4 利用界面工具导入数据3 e8 X. O( | w% G1 n
除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。0 `% v4 Z$ E7 d: {" {( \
选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。% m: N+ T( }) i" c* C( X' k8 H9 S! |
B* D' p+ @6 |/ J& G( k
|
|