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