- 在线时间
- 5024 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2009-4-8
- 听众数
- 738
- 收听数
- 1
- 能力
- 23 分
- 体力
- 77348 点
- 威望
- 96 点
- 阅读权限
- 255
- 积分
- 27131
- 相册
- 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 的帖子! A) r7 n Y) \1 |
* L4 p9 c* G9 z0 c: ^ F
4 b7 L3 I" p" ~7 f I* l 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。 E# Q5 M' Y* s% T! s6 @5 v7 H
% \; i; j% N5 B5 ?* C% t" E1 ^2 f13.1 数据基本操作1 g: U1 A3 v" h; A( ^! G! Y* Q
本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。$ f8 M' M& ^: g# w# p2 O2 f
13.1.1 文件的存储 _! `; l# M" U. i+ x
MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。+ L) b; }/ s; j$ W( H5 j( f
1. 保存整个工作区
$ ?/ m5 D2 {, E 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。3 d; Z! @2 l' d1 y b
2. 保存工作区中的变量 {8 Q! H; E r2 d. X
在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。, k6 R. k( q) M% A+ ?& m. _
3. 利用save命令保存' M2 y p$ H0 p/ D
该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:/ z2 f5 |9 O, b* \& p
● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。
2 z" I$ _& _# ?8 b1 k● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。
4 r/ |6 Z0 ?- w! c g' G● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。! I0 y! F% ^0 S5 A1 V
● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。+ T+ I8 ^, A5 G4 w
● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
" m) V3 C4 y3 H, z- F( ]● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。
- v% d! M; D* d9 q, i● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。0 s. p; ~" V# j0 L: F
13.1.2 数据导入
' [/ `- t0 ^ c MATLAB中导入数据通常由函数load实现,该函数的用法如下:
% J2 |; z& d$ Y8 f! m6 H● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。
, B3 a' h& Z: t● load filename:将filename中的全部变量导入到工作区中。$ i; ]- J7 K, \9 w% |
● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。
7 m N# |' H0 L# v( E* E; _6 M● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。2 A, n& V3 O% A, z
● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。. U1 ]6 A1 Y. @6 \% ?
● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。
. p9 U6 ~7 m( t; m( x, |例13-1 将文件matlab.map中的变量导入到工作区中。- q: r/ A" w. P* I" r* F
首先应用命令whos –file查看该文件中的内容:! V8 a- M3 m4 I+ }" k7 e4 r7 y4 b
>> whos -file matlab.mat
5 T3 @: _4 w% E' V" \+ X2 B7 p' ` Name Size Bytes Class
* q4 G+ \% M- Q% G. \/ ] A 2x3 48 double array
$ u9 W5 ]! X: g. P1 j I_q 415x552x3 687240 uint8 array: W/ ^1 K3 |' ^! k' s
ans 1x3 24 double array3 ^( D/ R: v8 r# ?+ v6 ~6 I* m) P
num_of_cluster 1x1 8 double array
! ~( E5 ^- T! G" J) P Grand total is 687250 elements using 687320 bytes- R/ o$ G" K, D, P U: b' D
将该文件中的变量导入到工作区中:
J* q- m" C4 }4 J9 ^ H >> load matlab.mat
3 V, m% W! ~1 T2 ^0 h) C' D 该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。3 w ?, J% T$ `' m* K( E
- l9 x) T7 g8 O/ a) g# P
图13-1 导入变量后的工作区视图
9 \( }" [' d( M% O& J" {" J 接下来用户可以访问这些变量。
3 \# {, ]1 u: ?0 G8 k# k! B >> num_of_cluster& S \1 E i. f" \- i( O6 q- V
num_of_cluster =
; S0 R# ?+ J* y* l) L) V8 D 3, F+ |3 R/ ]# V5 R# D, e2 h
MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:
{( H) H& t# P x) C2 y● importdata('filename'),将filename中的数据导入到工作区中;# w9 X( A6 C& @( X" n: d. h
● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;
0 l O7 x, b, b# @ @6 \● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;
1 N( x% ~& o9 K( K1 J l% h& J8 h" {4 Q例13-2 从文件中导入数据。
- P9 x3 {2 d1 Y- v! j1 H( _& s >> imported_data = importdata('matlab.mat')/ a1 H& r2 q S) k( j A
imported_data =
8 o H- r. b5 E5 V ans: [1.1813 1.0928 1.6534]
# m& C& h6 f; Q A: [2x3 double]
) L# Q, O, L) F2 m I_q: [415x552x3 uint8]
! w9 j, b- G6 T& ?- O# F num_of_cluster: 3
* G: k$ |% Y# `7 Q& [+ _ 与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。, B, @0 x# ?) `. o' \
13.1.3 文件的打开
! }; I L8 A9 [; Q MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。5 m; T7 y3 {0 I8 u
需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。+ D& }$ l" k2 y( _' }' `
. \6 B; K" y9 f& T# ]
例13-3 open与load的比较。
; a3 s7 b( Z6 ?9 j# p0 ~9 ?% O >> clear M, d( Y4 y3 u
>> A = magic(3);1 P! _2 c3 b( D! o, ?6 V7 C
>> B = rand(3);: D S& @; x0 F1 |/ k# L
>> save! g* E# l/ }7 @. D5 c/ [) S* G/ t
Saving to: matlab.mat. e- E- h+ y4 w e* p
>> clear/ {+ ?3 P% V9 g- W/ }9 @
>> load('matlab.mat'): K" o1 z% a3 ]$ O( F4 Y$ F4 ~
>> A
8 d8 r/ S' S- o6 k; k A =
% _9 H. [9 y( C* X# s2 Z2 ? 8 1 6
9 H" P1 K+ `/ Q$ y2 q0 f 3 5 7$ C4 z2 e) |( J' r5 j& w- m7 W' B! J
4 9 25 u$ J. }- M F. \
>> B
8 L" ?6 g. r1 S% M) M* x B =! x$ O& V6 T" [) i- G
0.9501 0.4860 0.4565
* [, Z# P: K2 `' z8 A2 @ Z 0.2311 0.8913 0.0185/ d$ D2 O$ I% d9 h
0.6068 0.7621 0.8214$ P- B) E0 G) A) @
>> clear4 L7 M1 J1 w9 e x0 t' C( M) j M
>> open('matlab.mat')9 m9 ]! ]" f/ D. m: O- _7 |) s
ans = + F; C: w/ |2 Z; o7 i
A: [3x3 double]5 J4 t, J0 i S y
B: [3x3 double]) L5 h7 t7 ^7 S( F8 M4 Z8 y
>> struc1=ans;
& v$ ~& h3 B7 d9 i8 m) i# y >> struc1.A
! I6 ?! V. H. K5 A5 i ans =
: ?7 A4 R C+ g u 8 1 6
* d0 c% B7 [; h+ I; x; s4 _ 3 5 7
- m! j2 u5 t' x0 K/ ? 4 9 2! O2 M7 }8 `0 @' D* R ?) v2 K
>> struc1.B
" P; E# z: s/ u ans =6 G1 t# w6 g! P2 ^! l
0.9501 0.4860 0.45656 c* f5 ?2 s m' r- @ I7 {
0.2311 0.8913 0.0185
/ C) V8 R4 S+ v7 p% S 0.6068 0.7621 0.8214
; i. b+ I0 ^ h1 y2 S1 I1 W13.2 文本文件的读写4 e' u7 `$ e& x b/ }
在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。! I- p1 G J/ d
MATLAB中实现文本文件读写的函数如表13-1所示。
) O. o8 O2 K! H# H5 J% `6 Z表13-1 MATLAB中文本文件读写函数0 q. ]2 f, N" J; ?" r9 Q7 z7 k
函 数
+ X- S1 u& O' n+ z功 能3 T6 c5 n1 Z- I5 A% T
csvread# g8 j+ W0 d7 E1 z5 N6 F2 R, \
读入以逗号分隔的数据5 C3 l R1 y% }9 m* D, D& V3 A+ A! ]
csvwrite
" p8 C, @7 D) P将数据写入文件,数据间以逗号分隔, O" t& v. T4 n' D9 P5 V. f
dlmread& `8 t+ W: A/ {8 M. u
将以 ASCII 码分隔的数值数据读入到矩阵中
- f W' @6 l tdlmwrite
) t8 Y0 [( c8 @/ r( x6 M; E将矩阵数据写入到文件中,以 ASCII 分隔
1 V& D- G/ f3 d) K- c" D, ltextread
# Q7 d" ], o5 q% L/ ~0 [; ^5 A从文本文件中读入数据,将结果分别保存7 Y" h. r) m7 n
textscan
( C; c# K& {5 a! a$ {从文本文件中读入数据,将结果保存为单元数组
: K3 g" r! i6 ^- f1 I" u" K
2 h4 Y" |' [3 {3 r* A; r& c 下面详细介绍这些函数。" \) J7 A" ]$ U' m; D, T& W
1. csvread、csvwrite: y3 p2 ~5 D7 s! Y- [) u( y* i) z
csvread函数的调用格式如下:% K# ~5 e, f2 T5 C
● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。7 R. E6 j3 e$ I7 X. l+ c
● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。* x3 T- R; e3 t. A5 D
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。 N( {, U7 j& F8 G
csvwrite 函数的调用格式如下:
. a/ ^2 u: N, p7 {7 D● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。( u3 A' N8 c0 L0 b& r" H7 r6 ?
● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。& N4 V$ {% v2 d, t3 ]8 {+ f: g6 a
● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。
9 A- f/ J; E( |' B" I; }1 u+ Z 这两个函数的应用见下面的例子。
5 P7 T+ V" Y2 V9 F* W例13-4 函数csvread和csvwrite 的应用。
" _, d: {! Y9 P6 B/ J3 w: M2 F5 O 本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。
4 m; w1 K& E* }5 c4 z 编写M文件,命名为immatlab.m,内容为:$ ~+ ~) y q$ n: ~) ?
% the example of functions csvread and csvwrite) v5 I+ n; z! M' v* R" t! F
I_MATLAB= imread('D:\matlab.bmp'); % read in the image4 b& P$ g- e" I
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image( V3 w8 N8 ]+ \. |
figure,imshow(I_matlab,'InitialMagnification',100); % show the image
* D- @ u9 K4 x$ _' A/ f csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
7 b& d) H, l1 r sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
7 ]6 Z; Q4 \7 l( | sub_MATLAB= uint8(sub_matlab); % convert the data to uint8
' t. l: x ? Z$ v0 H" x figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image% _4 ]( X! Q. D* m; Z. o- P
在命令窗口中运行该脚本,输出图形如图13-2所示。
3 c% m- s4 O( W4 q* i* x4 R& C$ X' e' N g# s" L2 E7 ]: y
(a) (b)
1 Q8 K8 s% U6 g& Q图13-2 例13-3 的运行结果
9 _+ N( X0 t- Z& C, R' s9 [! ? 该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。7 g O/ f0 G- C! n. d- I& U
2. dlmread、dlmwrite(个人觉得这个比较好用)
$ ]7 ?8 [, m- L( e0 c! _; z( h, \( E dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:$ t$ [6 } F$ k
● M = dlmread('filename')4 ^4 H; Y! ]' v# t% G% _
● M = dlmread('filename', delimiter)! D& r, M0 C) Y. w4 U
● M = dlmread('filename', delimiter, R, C)- r5 [+ D3 t8 |4 Y. z, W Q
● M = dlmread('filename', delimiter, range)
. ^: a) G9 y6 @& d- K7 q 其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。& \. R8 X. k2 m8 r5 y
dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:4 s5 v7 f& ]' x+ b2 {. `9 n, d3 L
● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。( m7 t. ~. U2 o8 V
● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。
, M, N- V: W# R# j6 B% Y. Z● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。: u% D0 ]" O* Q: `4 [, S
● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。; m8 v+ G% T* e6 w6 k, L
● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。! A0 I1 \+ `3 S8 k: \: @
● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。
1 }0 y% Q0 Y$ [) F/ S9 `- X● dlmwrite 函数的可用参数如表13-2所示。
/ d! v; X6 l+ {* Z; }0 T
* {9 M- m t8 [. w; ^7 I
6 Q, K" \3 d( H9 P r" i表13-2 dlmwrite函数的可用参数0 W5 l4 S2 Q( y; n4 g9 h
参 数 名9 h& ?6 c3 S, G4 L/ t* m! q
功 能
% u* Q9 m* E# ]* g) F$ [delimiter
+ r& Z6 X0 T* O( s, m/ z用于指定分隔符$ L9 \. j# X$ n6 ~* b
newline5 Z! H! ~6 V* O! ^! c' D
用于指定换行符,可以选择“pc”或者“unix”( J; g, @/ ]4 b% b: q# Z! l- r' z7 J3 B
roffset2 x' ~9 s* V9 q: |
行偏差,指定文件第一行的位置,roffset 的基数为 04 @' @; {3 I0 T. b! g
coffset3 j) R4 Z/ [9 u( {" N' e
列偏差,指定文件第一列的位置,coffset 的基数为 01 C; [$ o$ [* b$ D1 x$ W
precision
. P, O2 M2 {5 q+ t* A指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”) D: x7 e; @4 G4 h. S; v1 L& {
) D, \% o$ v3 e# ~- ?5 [
3. textread,textscan
5 [2 U3 I" }/ C7 x4 d% l6 U 当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。. Y& b/ @8 |0 o2 C: r) ]
例13-5 通过%读入文件,按照原有格式读取。- K' y" F2 G* d1 \1 ~4 n$ Y7 ]
文件的内容为:
" ?9 Y' {( i" G' F! J+ Z Sally Level1 12.34 45 Yes6 Q9 c& W& V4 `! N
在命令窗口中输入:/ f' C0 x& |/ }# h+ U7 i
>> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1): K4 V+ T4 d8 B
得到结果为:
5 @$ \, ?3 L6 X! g; w# ^/ Q names =
' z% b6 c/ U2 ~* K$ c4 b 'Sally'
; v) E }; A* o* g) I p* ] types = , |3 `5 a, y, f* w# y2 M
'Level1'9 F8 Y" R; ~8 X. g3 S" A( e
x =
( J+ ]4 O4 z, | 12.3400* e. M0 o z5 y& \, n. X" v1 E
y =
* ^4 Y, t E) ~7 U1 e* R3 ^7 S 45
9 O: N6 f) G) {1 H answer =
# d3 n0 t# e9 E3 z) b 'Yes'7 x. x d4 b& Y+ ^* N
! Q- P+ Y" s* ~* T; N' M- k2 ~
# @3 x$ `* R. |2 @
例13-6 函数csvread和csvwrite的应用 L: h* L% L; x6 [" N. t
Sally Level1 12.34 45 1.23e10 inf NaN Yes
9 L' D8 D+ H3 ]2 O, k5 M. P. S Joe Level2 23.54 60 9e19 -inf 0.001 No0 C+ a, L5 T- X! N( c
Bill Level3 34.90 12 2e5 10 100 No
/ c8 K+ e1 I+ G9 S3 r >> fid = fopen('D:\mat.txt');
6 Y# I7 I6 J7 Z2 ^/ `; c8 U >> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');' P* R- h* I- E" l* V6 O- s% P/ p+ Z+ q
>> fclose(fid); x% [# l6 W2 ?" P1 Y
13.3 低级文件I/O; v3 G# j( G' j% Q+ z5 D/ h
本节介绍一些基本的文件操作,这些操作如表13-3所示。
% I$ i" s/ S, x- z( C表13-3 MATLAB的基本文件操作
1 `+ B* ?0 T9 O" N: w/ D- \9 G函 数5 Y% Y Y# f! w6 Z: H5 g; [" S
功 能
# U# y. e* m+ Y6 p$ N' _ fclose
8 I' q2 L+ I2 {. l关闭打开的文件4 ^ \% X6 {4 b
feof
! F( t- u- G9 t& \判断是否为文件结尾" M( R: E$ _2 A& h/ z
ferror
" f# k- L1 j5 ?3 ^文件输入输出中的错误查找
0 Q) [. g) u8 n" M3 O4 s fgetl/ }7 e8 O" l) b, W! J- A
读入一行,忽略换行符4 p. g/ R8 S- y5 u, d4 }
fgets
6 B/ Q: ~: k; ^( f4 z读入一行,直到换行符. D: |# M; }$ j f+ S% o6 h
fopen# [# X- t2 z: j! E7 G
打开文件,或者获取打开文件的信息
$ ]2 ]6 o5 w$ V9 Q! J fprintf p6 M) O& l2 X
格式化输入数据到文件
% y: {5 ~, M x- h8 i9 ^ fread
/ P1 i* w- U+ Q从文件中读取二进制数据4 T0 y) G0 n, }! t% ^; q
frewind/ R3 z8 E! [% R; m% k
将文件的位置指针移至文件开头位置
8 f% V6 n* c* G0 H! x7 A) F# v fscanf
( X1 l; _! f" i0 `格式化读入
5 N0 ~- a' w3 w/ w% W fseek9 V4 Q( R/ i. s7 D" R
设置文件位置指针% {5 M' [' L' F0 Z" p( h: t. R% r1 |
ftell1 g4 F! c9 G2 S
文件位置指针
' w- U: S" n/ T6 }) _% ? fwrite; v; d4 t: [+ K# w9 {6 v' z; D
向文件中写入数据
6 n! D% q( Z; q* i; g $ y/ p/ }3 D7 Z2 `& t3 D
下面重点介绍函数fprintf。该函数的调用格式如下:8 j" Z- q" g( C' e9 h
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。! C5 I+ {' J7 W+ M' M V6 K7 ~% I
上面语句中,参数format由%开头,共可由4个部分组成,分别如下:! F$ e( K- G4 [, o9 y
● 标记(flag),为可选部分。/ X; N9 j) b6 D4 Y$ A
● 宽度和精度指示,为可选部分。7 ?% _1 p( |3 S \. e
● 类型标志符,为可选部分。
8 N+ d4 f$ b7 O0 k: D$ o● 转换字符,为必需部分。1 }1 u o7 s; Q, ?8 c) D3 Q
1. 标记) @. d) @, Y+ g. z. g Z
标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。
) g0 T; m0 l/ ~: p7 k表13-4 标记的可选内容4 `0 L, s+ `) @; J8 n4 `4 f$ a
函 数
* e1 z, ?6 j7 U功 能
' i9 f, B" [' U8 ?" Y: ?7 ~! ^# b; i示 例
. l" A. Q* Q% t1 M4 E3 R/ ?5 N# c 负号(-)7 n. R" e% x9 x% H& ^9 e/ [
在参数左侧进行判别
& d7 V, N- }& M8 ~" q8 O; v! A %-5.2d- X* u' w: L* j* ]+ V1 s
加号(+)- _& o0 P$ m" p2 r7 M. l
在数字前添加符号* T! c5 a+ Y5 w. V6 ~9 F
%+5.2d
7 l# u7 U G, O, y- @& \, a 空格
: F/ r$ |" d3 r; U 在数字前插入空格
% J( Q' t' J8 z( S x % 5.2d' k! i( @* J h: Y. {2 T: C$ A* l
0% g9 O1 Q1 Z: k& E
在数字前插入07 `3 K0 J0 e( H% }3 K3 [8 R
%05.2d* b( W% X( H4 m# }* x& |4 r
2. 宽度和精度指示: l9 g8 C' ~! }/ r6 F+ J
用户可以通过数字指定输出数字的宽度及精度,格式如下:' f J1 O1 w4 u; a( t0 b
● %6f,指定数字的宽度;
- `! T% Y# w* Y- K1 a' n7 Z● %6.2f,指定数字的宽度及精度;
8 h- w+ ~, c- m2 f● %.2f,指定数字的精度。) o5 [# J" {+ v7 \
例13-6 fprintf函数宽度和精度指示符示例。- B0 d" H! I' C. }" V$ }# R
在命令窗口中输入如下命令:; T+ U3 P5 }6 O J: P
>> file_type = fopen('D:\type.txt','w');
) R& @. _7 n2 K9 w) g+ d# y6 m >> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);
5 s p7 e3 E! o+ ~+ X$ ~ >> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);9 |9 Y; w" X( {# T* `
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);! i0 J: h4 }! Z/ _
>> fclose(file_h)
) W ^( U" {+ J! e ans =) V' O7 i! B+ h$ s0 f. E( d3 T
0
8 b O1 ?$ q# v+ z/ I% v% R 打开该文件,其内容为:
( s6 f" i4 V Q6 ^/ G: Y v/ j 1.20 -43.30000000
, Q' y( [& V' D8 F" o9 t 1.200000 -43.300000
' _6 s( x% [9 | 1.20 -43.30000000/ D1 z' E6 J% D/ k+ S
从上述结果可以看出宽度和精度控制的效果。+ U6 q0 g4 G3 O$ D# b
3. 转换字符* s$ `9 W% e" ~' q
转换字符用于指定输出的符号,可以选择的内容如表13-5所示。4 S# {$ f$ }. P6 a7 w" m
表13-5 格式化输出的标志符及意义
- I# s% `& w2 O标 志 符, T& `! m7 M1 q1 x
意 义 a, F& p P9 E8 l6 |& d, x
%c- q d$ p+ j; r
输出单个字符 @; U# P( J% N; U; d9 D' Q9 @
%d
# d! E# t: W* l. _8 P输出有符号十进制数) Q9 `) Y1 L4 t
%e7 P3 s0 L1 T/ V, ?
采用指数格式输出,采用小写字母 e,如:3.1415e+00
) f# k8 Z8 I7 ?- g+ p# Z1 g(续表)
5 H0 L2 _0 F/ }8 `) ~4 D标 志 符
+ P& n1 y" X: \: R3 a6 }意 义5 O- S/ R; z$ m8 o8 Q7 Q( G
%E5 j S( u. w: \
采用指数格式输出,采用大写字母 E,如:3.1415E+001 v0 I" @* K4 |) w* ~
%f
$ l* S3 {3 D2 W以定点数的格式输出4 j9 P1 J$ V; R( l$ g9 l9 I, r
%g C( N; t( K& i# O U$ U
%e及%f的更紧凑的格式,不显示数字中无效的 0
: v; z0 h' J: ~9 ? %G V2 r# Q! z1 W0 r( ]
与%g相同,但是使用大写字母E* J: f9 Z$ n% R! A9 Q
%i
( c9 a8 @, I. g. E! L. _; R& x( g: V( N5 e有符号十进制数: V+ V2 ^# Z5 B
%o, f2 E0 b/ d9 T6 D
无符号八进制数- g: G$ U" l7 _6 N
%s
; l/ ~* }+ N8 Z0 o输出字符串7 }8 a3 `! C0 G8 [* P c; S
%u
9 b1 Z* v& P% d: t1 u+ B8 \, J- w无符号十进制数) z8 T/ z+ F. p( l
%x' t h: c! k( G% S
十六进制数(使用小写字母a-f)
$ r5 e8 f+ h! j+ k& T %X
% [3 R9 J$ w/ K- n; o! X; Q w十六进制数(使用大写字母A-F)6 X% L$ T0 s- g# ?4 W
7 b; l1 w0 m/ L, X7 j _ 其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。
) ?( U5 d, C( H& x/ E例13-7 fprintf 格式化输出示例。0 s) @2 O$ Q$ [# E0 j
>> x = 0:.1:1;" I% Q3 n2 [, C
>> y = [x; exp(x)];
! _! j" P% m8 ` >> fid = fopen('exp.txt', 'wt');
# f: S9 M$ |7 T0 T1 x >> fprintf(fid, '%6.2f %12.8f\n', y);
" G4 F+ t" c4 {9 T0 B >> fclose(fid)
3 E$ u' h; a# O* _/ P ans =
$ N+ }% B; e4 |% s4 F 0
5 l' [0 x4 m( p! Q2 h 显示该文件:
: U3 b; ?; S7 l2 O" w1 e >> type exp.txt/ s2 {& t% T( i2 b/ z$ S( j
0.00 1.00000000
. l/ I1 e. O; I) l- x: y 0.10 1.10517092
6 u& @8 s! u6 c4 j3 i' G: h …
5 z6 f1 O, ~- x 0.90 2.45960311* c* w) C3 Y$ I# ?+ e
1.00 2.71828183. d3 Z9 C2 U& p5 Q d
例13-9 利用 fprintf 函数在显示器上输出字符串
1 q9 M7 L( a/ K >> fprintf(1,'It''s Friday.\n')
0 ^, w1 K3 t% b- U% @- r' a' f! Y It's Friday.
5 e; R, p( v2 z5 l/ F$ _ 在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。+ z7 q2 W/ h; z; ~/ p
2 g1 |% h2 q: x0 o
, y$ s3 e- Z& a6 @' B H* K表13-6 MATLAB中的常用转义符# ^4 G2 n9 L* S: Q/ Q- Q
转 义 符; ?3 U. Q% O$ k: \# }
功 能
W9 U8 |* V7 U4 f6 P9 n- W \b 退格
) C" _ E v- @& `* R4 c \f 表格填充/ p* ~( x2 x- u" s
\n 换行符
# \& X+ v: ?( f# ]/ i \r 回车
9 t; V, s- Q" x9 Q9 i j \t tab
3 z. q! p2 E* G/ p; y \\ 反斜线
: b9 d8 F7 a2 C \'' 或 '' 单引号- S$ A2 u) K- K
%% 百分号
5 l" q6 k& M0 \' X3 T- d13.4 利用界面工具导入数据
7 y" C2 w8 `6 G# p/ J6 \ x 除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。# ?9 J, f8 R1 L
选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。* K6 q6 A$ s* c$ m+ @( d
" h# q4 w- C5 w8 e3 W
|
|