- 在线时间
- 5024 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2009-4-8
- 听众数
- 738
- 收听数
- 1
- 能力
- 23 分
- 体力
- 77849 点
- 威望
- 96 点
- 阅读权限
- 255
- 积分
- 27281
- 相册
- 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 的帖子! V6 Q* P) o3 y. E; ~
l, T" y8 d% k. }, t! H% T
* [) Y# W8 a7 c1 v* X3 e
在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。
- l( `6 Q$ `5 w4 ?$ c# k F' M, K
13.1 数据基本操作
) s- j. C' M: e2 E 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。8 {5 q4 U; p7 U, D+ ]. |8 y4 O
13.1.1 文件的存储6 F6 W0 P5 l7 L1 q$ P
MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。) }8 [! a# I: j8 I' X; ]1 v( r
1. 保存整个工作区
% \5 i. R- t9 _( a 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
5 q' R* [! F3 W7 e 2. 保存工作区中的变量
8 }; Q- ]. ^( ` W$ |- U7 C7 z9 f 在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
4 V0 Y3 L3 K; w7 r 3. 利用save命令保存- Q5 S: e! i# k3 X0 G/ {9 e
该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下: u( R4 p8 B' ~. Z- J
● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。
0 k" Z: ?4 n3 N● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。
( A7 z5 M D( y6 D! f; Y2 P. G● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。& [0 M M0 j E& v# v) {
● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
z1 {( T7 V; ~& r: P$ @+ k● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。) ]) B/ X0 w: k$ G2 f
● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。7 n) K" C' Z3 @# |! `
● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。. A8 y) u+ c' I; X( t/ e
13.1.2 数据导入
" j2 `% z% `" G7 b$ R2 p MATLAB中导入数据通常由函数load实现,该函数的用法如下:
/ V* `/ C( b, @, {5 Q* N/ {$ C: }● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。
+ d3 m/ m h; ~3 N! t3 \● load filename:将filename中的全部变量导入到工作区中。' s: B0 Q1 ?/ K! \
● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。$ ^3 K0 p8 C8 z! B5 y w `5 Z& ^
● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
0 e4 X5 x+ r; n9 c● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。5 s$ Y$ h9 t4 ]. R& p
● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。
+ } k0 i8 z. _: N# |例13-1 将文件matlab.map中的变量导入到工作区中。
. c; ?1 }# [; Z& G 首先应用命令whos –file查看该文件中的内容:
% p U3 r: {9 D3 A8 w >> whos -file matlab.mat; @1 M% v( [, z) F& m* A) f
Name Size Bytes Class
H9 i* w: { ]) ] A 2x3 48 double array0 N" M8 P" S S1 _% p" j
I_q 415x552x3 687240 uint8 array( k S0 K- X. M& L# _! Y$ u; B8 e
ans 1x3 24 double array
% e9 }' h7 s$ e- x% @* }4 M num_of_cluster 1x1 8 double array. I$ z' d. l* J6 [- h5 V4 ~1 }# D
Grand total is 687250 elements using 687320 bytes
0 Q+ J- ^! f m" I y8 j4 g4 o 将该文件中的变量导入到工作区中:
5 |0 J7 q, J; c5 N4 o, r* W7 w >> load matlab.mat
8 F1 e: m: v# e) } 该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。! A* _. K( [6 ?( |, ?* H
# z4 g8 c; Q$ I+ F4 y! ?6 s ?4 Y
图13-1 导入变量后的工作区视图- J: J8 d" t5 w: E$ z+ u" |; |
接下来用户可以访问这些变量。* p1 q6 ]( m; t
>> num_of_cluster# I% N( s9 [( c5 S
num_of_cluster =
1 \* M+ \$ K; H+ X0 m 3! y! j9 Y3 j' H
MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:0 O7 j# I/ K! s: S( J4 m# D" h) f
● importdata('filename'),将filename中的数据导入到工作区中;+ Q, f2 H; z+ Q1 N; k n# v
● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;
3 y2 O$ F% u* n( v7 `; T● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;3 l o2 k& S; } C* y; c k
例13-2 从文件中导入数据。' M3 p! s; G: Y+ C6 s& c
>> imported_data = importdata('matlab.mat')
: K. ~) i r% \6 ]4 H E6 P( b imported_data = 0 N6 a9 a9 r1 T# M8 H" L
ans: [1.1813 1.0928 1.6534]
9 W) \- z+ a" j N' p A: [2x3 double]1 [# p5 J" ? F4 ?8 d
I_q: [415x552x3 uint8]
% M8 D. {% N$ X) I x num_of_cluster: 3
/ [: e$ H& ]2 H2 `5 U7 u 与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。
# |- i% V0 O- Q2 N8 O& G. s( p13.1.3 文件的打开
9 k1 B( l8 J: o5 X5 ?8 L MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。5 r ^9 b5 T( z8 ~! Y, ^* @ t
需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。& L- A% X3 C' i: v+ |
) ?$ | t& }/ D' K/ A9 A: R5 |
例13-3 open与load的比较。
5 h0 l" t" p0 r$ r3 y! b% g2 q >> clear, H, n8 j7 y& D _& C: A; d4 s: |
>> A = magic(3);
c/ {( a8 K( G1 x. g( b, o >> B = rand(3);- ^! m: E. @8 ]3 I7 D4 d9 ], R
>> save
% J; F/ y, I8 b# w) | Saving to: matlab.mat E" k/ |5 l2 Q! R
>> clear
8 T6 u# }4 K% D+ o% D8 i >> load('matlab.mat')
& a6 }5 Z! {8 H1 } >> A
3 ~* d3 h: [9 M* d A =1 D$ l K% G: ]. ]
8 1 6
. i; w1 o6 C3 E3 |, C7 y6 P 3 5 7+ ^: p0 A$ c$ Q- T! G, r: H
4 9 2( v- D( q" M0 {+ m
>> B1 I7 d, x7 d/ c
B =
$ K) z2 m& X% m* g/ Y0 l 0.9501 0.4860 0.4565
' w: n! [2 P/ r' y 0.2311 0.8913 0.0185
7 d5 F7 |* [( X' n/ M; S8 R 0.6068 0.7621 0.8214
* d. B" _, x+ M0 E- D y. X >> clear, D" Z4 A. j8 [5 D: b
>> open('matlab.mat')
0 q3 {* [! f% p* l# O5 x ans = 4 A6 p R" d `9 q6 G5 v
A: [3x3 double]9 g* K$ u1 x \# n3 S4 N* o
B: [3x3 double]
9 a% ^; o( E3 V: H! M9 y >> struc1=ans;6 u' |+ |. v: r2 M
>> struc1.A
) d" Q3 I' O. x1 V* ^( m ans =5 ^# C: m. D1 l
8 1 68 |. C* W0 ?+ U' g4 x8 I+ P
3 5 7. E2 I2 J- G' S8 x6 K! h
4 9 2
4 I4 k& n3 @, P. {% v9 a >> struc1.B
% D$ o. Z7 z. Y/ H0 F ans =
% x7 C( \& D5 s- ~ 0.9501 0.4860 0.4565) x( w' A r0 l$ a: r/ j0 u
0.2311 0.8913 0.0185
5 A$ x7 L( H) o9 L 0.6068 0.7621 0.8214
1 m) P, x7 y* |7 c2 ? ~, t0 j. s13.2 文本文件的读写
) `, d$ {: ~' E( }) i2 x6 \6 ]' b 在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
0 \/ C8 g! r. E" J6 U4 l3 N MATLAB中实现文本文件读写的函数如表13-1所示。. y) I0 D: ?$ W w
表13-1 MATLAB中文本文件读写函数
9 t0 |- Y1 f7 u( u& M9 p4 J* @( T函 数
3 g4 _, X1 J, B- w功 能 U. B0 l4 W4 P- z6 i q
csvread) H0 h k4 L, D( c, ^2 j
读入以逗号分隔的数据
) O, P- {/ E$ }3 B; x# K, }csvwrite
! _! b( D; }3 W1 ?+ n将数据写入文件,数据间以逗号分隔, U4 Q/ u' z/ T% i5 v r0 P
dlmread5 I$ |; k/ ?3 c u7 Q$ u8 A
将以 ASCII 码分隔的数值数据读入到矩阵中5 @1 S/ l, v/ g; I8 m
dlmwrite7 b1 V" w" F1 ~$ G% [( g( [' K
将矩阵数据写入到文件中,以 ASCII 分隔
$ } V7 m4 y: {& ftextread# V x) a \3 ^, x1 }$ m4 i- I
从文本文件中读入数据,将结果分别保存! Y8 |9 P8 b+ \5 I' V8 p5 i
textscan
4 n; p4 x" v& S" Z% O7 w: R+ w从文本文件中读入数据,将结果保存为单元数组
* w) x& K- }6 \$ x( H1 L7 N2 I
' n+ f. s/ E' R& ] 下面详细介绍这些函数。! ~8 u2 R/ @* i$ b1 H$ p6 r& A
1. csvread、csvwrite
$ {* Y) j# G5 u1 A% F9 V5 X csvread函数的调用格式如下:
: I* W: ^1 F! C% E0 g0 @ n, a9 B● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。
6 Y" _/ y+ D b6 Y9 ]' b4 m; W( [● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。$ C8 C$ x J% g3 L6 c3 j
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。
# P1 s: L1 b4 g& H* M/ m K csvwrite 函数的调用格式如下:
. H4 [. m. u0 Z' Q0 H/ }1 G7 l● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。
( |8 y1 X2 f9 P4 r1 C● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。- `% V9 c- S; f; y, A7 `
● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。
- Z( {: ?/ `* f. I! n 这两个函数的应用见下面的例子。
. c# F8 T8 ?* Y( C9 t5 F; W例13-4 函数csvread和csvwrite 的应用。
# z H+ O$ ?, P5 z5 r: G( m% ~ 本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。# e1 Y( y! l8 T9 c% {) o
编写M文件,命名为immatlab.m,内容为:' |/ }( k+ D6 z( K
% the example of functions csvread and csvwrite; g% N8 c. ~% Y) j
I_MATLAB= imread('D:\matlab.bmp'); % read in the image3 q6 [6 a9 @: w& \: j6 M, E
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image
# s4 l9 Y$ y& p1 S6 Q0 [: w figure,imshow(I_matlab,'InitialMagnification',100); % show the image
+ j) J" H4 n# v! c0 v1 ^9 `( C csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file4 G3 o3 p5 A; B2 F: H$ Q8 m9 A. r
sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
1 O7 r" I1 P3 {6 B% j- X O5 Y/ {( t sub_MATLAB= uint8(sub_matlab); % convert the data to uint8
- W+ i, T. L1 N+ ? figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image
% S, e: U. K2 }2 {" o1 G7 l 在命令窗口中运行该脚本,输出图形如图13-2所示。
9 \2 L k8 _' G" a; K- @9 ]1 r" o m; S; m3 q0 G! s4 f
(a) (b)& Q* A5 G* j3 `
图13-2 例13-3 的运行结果* _: p) V. @6 V& a0 Z
该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。
2 N: u0 H2 v6 {2 G e8 l$ e 2. dlmread、dlmwrite(个人觉得这个比较好用)
/ i3 ]( }7 M6 }) K dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:! x. n8 Q3 _, D; k }1 y6 G
● M = dlmread('filename')# ]: v0 d8 Q1 j
● M = dlmread('filename', delimiter)
5 x& C. }* b. l% j● M = dlmread('filename', delimiter, R, C)
. ~, K6 s9 t8 p; \/ u. o● M = dlmread('filename', delimiter, range)
D. o1 M3 u0 ]( M0 } 其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。
`/ ]6 A) {+ r% l2 \' w dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:
: {1 w) b( X, { u) j● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。
8 Q+ D, }( ?' G& g● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。3 B$ [! V }* {( O, }7 t; L
● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。
8 R' v9 j6 v; c; l5 p% d1 k9 X● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。. |& ?, f$ C, r/ R, Y
● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。/ q) @ e% c( M
● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。
! U' ]! n3 j. }0 D● dlmwrite 函数的可用参数如表13-2所示。* w3 m/ Y3 d: p
8 z# h, j8 n0 G. E ?7 _2 o- c$ l' c7 b2 S' W& M" g
表13-2 dlmwrite函数的可用参数
2 J6 R$ @# z9 V参 数 名( L3 X# D) e: G" t3 @
功 能
- b; S3 g0 P( ]delimiter5 X+ X% V. b1 r+ A$ K: K4 i) N! J$ A
用于指定分隔符0 e- _2 |+ m8 E. ~, f* X
newline
6 E9 i3 m: B; a; t' ~用于指定换行符,可以选择“pc”或者“unix”
1 h0 V/ G0 A2 ~/ [roffset% |$ v. r$ i' j
行偏差,指定文件第一行的位置,roffset 的基数为 03 }4 P7 V3 f7 J& j* V, X
coffset% W0 m# D/ [ y& f* `
列偏差,指定文件第一列的位置,coffset 的基数为 0' C3 U% N+ ^+ u, n
precision
) G; O% P+ h: o指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”
" N, F6 q) l ?$ j8 \0 @ ( I/ w6 c; Y. P% L& E
3. textread,textscan* o; @' f% y# V4 {
当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。3 V) L1 `. [) ]9 g1 v! r2 R- p9 x
例13-5 通过%读入文件,按照原有格式读取。
) J0 I$ Q* I% `9 W1 q7 }4 H文件的内容为:
) K: V4 U8 q# X7 l; g5 T+ U Sally Level1 12.34 45 Yes
8 p4 e$ C' S$ `# b: G7 T在命令窗口中输入: G$ M4 e4 A/ Y$ F B
>> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)& O! ^ r( C2 q+ P0 h
得到结果为:! [$ m! U$ D& f' o$ q% {
names = ; J7 F+ `( {. R. R$ V7 \
'Sally'
+ |, ]: I( ~( _ types =
- w' t# h" |0 X! b6 O$ n 'Level1'
% x X# `) I( e$ C4 g, T x =
/ |7 _/ @* s! Q" P- l2 r& b+ O 12.3400
9 W6 p* j7 z4 a q7 x y =, n. L4 Q8 `( v) h
455 V' `* Y1 Y4 S0 h& D3 ]+ ?7 D S
answer = ( B& d7 s* m+ }* I( T1 X9 P1 i
'Yes'
* v+ h: p9 m1 j" j) M9 M$ ~. ?
- q3 m7 v/ N5 b7 L, F
# ^. w" y# _" b7 n1 l# l 例13-6 函数csvread和csvwrite的应用9 o5 I% ^/ E5 e$ o3 U8 X( O! i
Sally Level1 12.34 45 1.23e10 inf NaN Yes/ j* w0 d' i/ |6 V/ C% \
Joe Level2 23.54 60 9e19 -inf 0.001 No
@/ U% i0 a6 t% Y* _% r- | Bill Level3 34.90 12 2e5 10 100 No+ o1 o7 B Y( J0 }5 U
>> fid = fopen('D:\mat.txt');( s+ L& V) a1 N7 M0 T
>> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');
g& H- O0 p& ]$ C; z >> fclose(fid);& o3 \% U2 t* S8 M: l: r
13.3 低级文件I/O
$ @6 `' g; S/ T. d; K* p0 p 本节介绍一些基本的文件操作,这些操作如表13-3所示。
2 A* z: Y' `2 U表13-3 MATLAB的基本文件操作
- z9 E9 N9 d, B8 o2 O函 数/ w4 h8 _; O% t$ e! F" q
功 能; s9 o) K! T& w2 A- P- ]
fclose
9 D- C: \+ T1 h关闭打开的文件) V- p9 T8 y! W) f: v! f
feof0 k+ C0 I7 y/ [8 D0 ~" t& J
判断是否为文件结尾
' U! n" g5 l% t+ N6 f2 j3 D ferror
' F7 H' @4 a' L7 M文件输入输出中的错误查找
, C0 Z2 C& i3 O% X# R fgetl
/ \# P+ A/ Y; ^6 ~$ s读入一行,忽略换行符0 w8 u4 G: r$ M& Z& }% ] g
fgets8 h0 ]" {+ R1 e8 l, Q
读入一行,直到换行符( a2 A& O# `0 y. ~; W- C
fopen6 [2 t! U% n) \- U2 i' {
打开文件,或者获取打开文件的信息
& S7 r7 O$ m4 P& f P5 L fprintf( v% }! B, ~0 X" N, D/ P- Z
格式化输入数据到文件
8 I$ E; q& n; m( D: b fread7 W1 o& D g) D. ]1 I
从文件中读取二进制数据0 u2 F( t3 w! H
frewind
" n3 V$ ?$ F, Z V6 z* ~将文件的位置指针移至文件开头位置. H, B/ |' x9 s* `
fscanf
& r4 C, [- R- o) G! [格式化读入
/ y" N& q8 f% ]3 \9 n) O; e+ a fseek
- q) o' c1 m$ n: k) ~设置文件位置指针5 i0 y. f+ D" c
ftell
- m9 ]* f) `& f# a$ U文件位置指针3 y8 m3 D7 k/ p% F G0 t- x
fwrite* s: j% H% ^' z+ S0 @! e3 r
向文件中写入数据
) v- \, H" M9 m# ^9 ]9 Q ! v% m# ~( k4 t1 ]9 J6 c
下面重点介绍函数fprintf。该函数的调用格式如下:& f/ N. U. t5 H$ N5 y
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。; _/ J0 a% `5 ^5 K. x( b9 b" ?- |
上面语句中,参数format由%开头,共可由4个部分组成,分别如下:
: O$ w9 A2 F$ ^7 v● 标记(flag),为可选部分。; N7 w7 E5 i; r# `& ~- W6 y
● 宽度和精度指示,为可选部分。
# A7 R8 p- y4 t● 类型标志符,为可选部分。% x0 g0 c$ @, c q& g+ [
● 转换字符,为必需部分。
' v; K: t6 r! {% M 1. 标记
% N7 y9 [- U2 o9 c2 G 标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。4 g/ n" R L$ J* T5 w4 n
表13-4 标记的可选内容
0 G& p% |4 v1 y) D0 y函 数7 B4 G. J9 m' ]; Y8 T" u
功 能
# N7 `$ ?$ b. r8 x( ?$ h示 例
# B, J$ s$ m. v6 h" \4 n 负号(-), Y% L) l$ A. F! v) `
在参数左侧进行判别4 c( \. R) @1 I x$ Q1 i I% t
%-5.2d
+ b( k5 H2 ~% u8 R* I- e$ l9 j6 r. o 加号(+)
|. J4 l9 e7 K; F 在数字前添加符号
. I1 b% e7 [, v. ? %+5.2d4 a1 \1 a* n0 j( a9 F4 r) J4 D
空格' b0 h( d+ ]+ }- {" m
在数字前插入空格! l: R7 u$ e6 p
% 5.2d( F$ S9 N' Z9 y: I0 l$ R Q
0
' B+ E0 N: g7 f$ s 在数字前插入0
, F3 N6 q) J% C* i) d %05.2d
3 s; q" z7 u* K$ m; P 2. 宽度和精度指示
: ^# T* N! {0 A; Q: w 用户可以通过数字指定输出数字的宽度及精度,格式如下:) Y$ T5 @: e v. \* j
● %6f,指定数字的宽度;
3 z/ W# k6 H% L/ T( d6 ?/ i+ W: v● %6.2f,指定数字的宽度及精度;
. k( C4 j- M- ^7 c- M● %.2f,指定数字的精度。 R" w8 N9 V: b$ t: C+ R4 x8 x" t u
例13-6 fprintf函数宽度和精度指示符示例。+ O6 }- C' J5 V; P( o. `7 U0 p, h; {
在命令窗口中输入如下命令:
2 C, } k# u" e' {( e5 u, t >> file_type = fopen('D:\type.txt','w');
- Z: X* w( Q6 {5 U- P# C >> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);
5 ]2 C4 r/ Y% E& Z+ a >> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);1 Y4 @3 @4 V. L) ]& z; B
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);8 g, @+ M/ L5 S7 \' v$ y- M
>> fclose(file_h)
3 U0 a& w2 v" @: v ans =
5 M- \. s0 F& d+ w 0
0 L% E, f7 Y$ N+ @& }2 G 打开该文件,其内容为:# C- B$ U* t% o* C; \
1.20 -43.30000000
6 t* r- r3 P, L( ] 1.200000 -43.3000003 F- `, S- ]* m9 T. O
1.20 -43.300000006 @4 |# Q# x- j
从上述结果可以看出宽度和精度控制的效果。% M5 [7 o8 _! t/ D
3. 转换字符
' y3 m$ R5 l$ [+ h; |; G 转换字符用于指定输出的符号,可以选择的内容如表13-5所示。
( d Z0 _4 o2 @5 N1 r! ?表13-5 格式化输出的标志符及意义1 k. V" D s+ f) J$ M; [
标 志 符- A( t! P! g3 a; M
意 义
( g9 S6 i# `0 I! Y8 P7 E %c
% n3 x5 S8 [6 v: J$ o7 x4 U3 |输出单个字符6 J: z+ k( x( K6 J6 z
%d
, Z% _. D) P7 x( h' g+ L* k+ H输出有符号十进制数
5 f2 X ^& s5 l) Y6 B8 {: f8 R %e0 e+ {" m1 N- Q/ u; a5 t
采用指数格式输出,采用小写字母 e,如:3.1415e+00
6 W; e5 D7 u d. K6 d(续表)
0 w2 w1 H L7 H# _3 f标 志 符
. C' |" Q D* |8 G1 Z) M6 q意 义
, C6 ]# T% n4 \4 x! w: p4 r6 H/ [5 X %E/ j- }- o& E1 a8 O+ u7 a. ^
采用指数格式输出,采用大写字母 E,如:3.1415E+00- X$ t/ q$ w `! ^
%f
4 L9 N% J6 [* z% u! w$ V以定点数的格式输出
& X9 ?( L+ n2 D* C3 p0 E5 c %g
* D- x! [2 ]2 p" d9 o# I- n%e及%f的更紧凑的格式,不显示数字中无效的 0
6 w) Z7 @+ H o6 ^- \+ L %G
, \( w( ]1 d+ f2 V) u( n与%g相同,但是使用大写字母E! T* S% c5 s l1 W0 w& V' k
%i$ z |# l" X7 ?
有符号十进制数
' i* X' y4 H* Z' n4 B6 P0 g2 R %o; _) c" S/ B, @" }. y. A0 y
无符号八进制数
. L& v) E/ M v( V( m8 \0 Z %s
9 ? z9 V m; Y" U: i. w+ z输出字符串" ~# N; Y+ j/ E1 M
%u" R, x3 N$ ~4 [; b
无符号十进制数3 m0 Y9 G8 N) | Q( W( W: g0 e
%x
3 t5 |- i, `" u s# {5 Z十六进制数(使用小写字母a-f)
. t& J2 p- j0 ?, M* z% ~' U2 M %X/ @1 B$ a0 h( n+ L4 `
十六进制数(使用大写字母A-F)8 i' e5 d+ K7 n
' T2 s/ o- \4 u0 K8 J) ` 其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。. X# q; |: ?# U' t0 O% {
例13-7 fprintf 格式化输出示例。
8 T; Z7 A/ }( I9 A, H& v4 D: N >> x = 0:.1:1;9 w8 L6 l2 R5 s" D% Q `
>> y = [x; exp(x)];( B4 b6 |8 Z' u# x7 A
>> fid = fopen('exp.txt', 'wt');
8 j3 q/ x+ D$ t4 U >> fprintf(fid, '%6.2f %12.8f\n', y);9 u8 @7 [& _2 T9 [8 b
>> fclose(fid)
7 b2 T7 V) G* i x1 x" A ans =* t3 h( j7 Q1 k& s& B: N b
0
+ i) q& o0 Y1 a" i" ^% p8 [ 显示该文件:
: M$ @2 w1 a: M >> type exp.txt
5 B+ N4 P$ [3 s( i* Y 0.00 1.00000000
/ z: u( w, ?5 H' p( O 0.10 1.10517092
5 i! S: z# Y! b8 l6 m k, A" q …
- ^1 g$ Z) h8 l$ h2 r# ~0 w 0.90 2.45960311
0 P# Y$ z! k0 o# \ @ 1.00 2.718281832 \% c! N: B/ Y& w# A$ d& m7 {
例13-9 利用 fprintf 函数在显示器上输出字符串
! h" K7 P9 X' E" v! X( l, O >> fprintf(1,'It''s Friday.\n')
0 |0 J4 r7 u' g/ x0 F, {6 Q It's Friday.
# d9 H, S, [# q: A2 W3 l' ? 在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。9 O7 h! \; ]% G3 h
( h% x+ W" ?4 _ t7 b9 Q3 _1 U
3 T; ?: U# T8 w* o表13-6 MATLAB中的常用转义符) \& T9 u2 @- L* @
转 义 符
+ x( R) W! U" X, t功 能
6 w8 b( {# m8 J0 I \b 退格
. d( z3 X! u. C! I, j. @ \f 表格填充
' H' H, u- C; W7 ] \n 换行符
- I, O# k. a9 ^$ z% Q \r 回车
- t+ C; H. G, [7 @: }0 Z% c \t tab3 ?( b! [. p2 l, [ j, b
\\ 反斜线
. \% X4 ]* h$ T) A \'' 或 '' 单引号
# ^$ b+ R1 X! x: @$ S3 g %% 百分号
2 A8 V: M0 C- T6 a13.4 利用界面工具导入数据: v. j" O( ]6 g' O8 ` O" D. d
除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。
6 N3 W9 L" I m+ o+ R4 {$ p1 q. i 选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。+ n T) p% S1 K
$ E( f% U& c9 q+ b$ L" T
|
|