- 在线时间
- 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 的帖子+ h+ g8 o5 \- a7 |: E
9 l& ^) A3 g% q$ k9 Z9 M6 w/ Z: H: ]7 A/ |; C- r7 h2 O6 F
在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。
$ b# ?& T- }) C$ b3 A$ x
5 G$ D. K' i( k13.1 数据基本操作
2 }" i/ f0 ^# O 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。
+ L X# U* c! F- w13.1.1 文件的存储
+ t0 F9 }7 N. p& }, e MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。# q( g6 ~0 m' V& Q+ z( p
1. 保存整个工作区7 w, f3 z& q' V, {- {6 V
选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
2 ?- u, H) r" g 2. 保存工作区中的变量- H4 v8 P& b. ]9 d- g0 l3 s
在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
$ \8 m; L% Y, A0 r2 j8 Z 3. 利用save命令保存$ @0 E4 P# i- L2 g/ F, c! Q
该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:; F1 p V% d- }: k" s
● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。! l% U- i- Y$ Y( b
● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。) A' b! a2 u! X
● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。
8 j: Z$ _! b2 p" l. S( t+ d● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
! a Q% P- P* L! o9 t7 j5 H● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
# M6 ~4 F* T1 C4 v5 c● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。
4 V: D* R3 g6 b2 z● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。+ \; s" `( w' g& C0 r
13.1.2 数据导入% _, `6 P* {3 {/ K4 P# K5 v
MATLAB中导入数据通常由函数load实现,该函数的用法如下:
% A7 e( i6 ~& ]● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。% u) V# f6 v6 t+ M0 n* Z# O
● load filename:将filename中的全部变量导入到工作区中。
4 @3 o$ P% N0 \2 U/ M, x2 ?● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。 s1 ]2 ^1 d& q' @
● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
5 H0 |, o! R0 K, X1 u2 f, h0 E● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
; z0 y* Y9 ]7 z: {7 G● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。1 _* o' o+ p$ [& X) J* o
例13-1 将文件matlab.map中的变量导入到工作区中。
, e0 W5 Y/ s2 `: \ 首先应用命令whos –file查看该文件中的内容: Q+ ?* P* A7 K' S e: y9 k
>> whos -file matlab.mat" ~% _: e4 i6 b" M/ ?- A
Name Size Bytes Class/ {% y$ [) t$ S1 y
A 2x3 48 double array l- P- ~: @1 ^" Z* |1 Q. `2 b. h
I_q 415x552x3 687240 uint8 array2 _# |( N# J" J: J
ans 1x3 24 double array7 }' N$ {' `' J" u4 ]
num_of_cluster 1x1 8 double array
! ]6 H/ K. R+ J8 | Grand total is 687250 elements using 687320 bytes! l8 o$ m7 |/ I- L6 b4 u
将该文件中的变量导入到工作区中:
]. ~% D/ S6 h. G& S >> load matlab.mat9 i7 y& Q2 U) L3 I L; J. Q
该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。
8 b8 B1 ]+ M' s" _1 k3 ~9 D9 E9 |6 b% W& `+ m. g' M
图13-1 导入变量后的工作区视图% b( [( [" r o1 ~
接下来用户可以访问这些变量。5 \3 l# W9 h" Y7 A! `
>> num_of_cluster
: X( ` u8 H, H0 l: f0 J I | num_of_cluster =) a6 y- G" N6 k g. C5 y
3
9 H% P5 z- b9 ?: ]: R3 Z6 ~$ b MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:
! n: p" W7 q8 C: E● importdata('filename'),将filename中的数据导入到工作区中; ` Y0 N4 q' E; p
● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;2 M5 u3 @5 V2 N+ ?, v
● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;5 @+ ]! }- |! w
例13-2 从文件中导入数据。
2 O7 `+ Z7 r& q8 c >> imported_data = importdata('matlab.mat')
: y) f0 e+ V, H9 [2 [ imported_data = ) J( s" L" N) _+ Y) J* g9 n: S
ans: [1.1813 1.0928 1.6534]
0 O, z- x, w- T- X9 J A: [2x3 double]
; V, g, O- Q# H6 Y! B5 Q, |) v I_q: [415x552x3 uint8]
$ v0 Z: @7 B2 S' I( N+ L$ F num_of_cluster: 3
4 Q4 }7 u$ h* u- ^9 B! s" Q! ~ 与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。
; _+ s" {2 T# {: i0 [/ ]13.1.3 文件的打开
4 Y& D0 {; p' p0 e( Y MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。5 i; ^+ ^8 @% }9 {( k3 b' N
需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。
* U* R8 |4 T! j2 D3 S: k 2 W5 U5 P# Y9 A& K4 g1 I/ u5 |
例13-3 open与load的比较。
- ]6 ~( q6 b9 m# J- ^/ I. c- H >> clear: x0 K Z. E" L$ l( m
>> A = magic(3);
1 M) }* f8 ^! f: i/ x >> B = rand(3);" G0 f3 k! ]% u7 v; X6 i( n
>> save
' P9 W7 ]2 i. c* q) j4 P, J Saving to: matlab.mat4 c0 c+ K0 W$ d% z( R1 @
>> clear c! j A) f' O, @5 A( y
>> load('matlab.mat')4 s/ @# \( I! ~( c
>> A
+ @' A1 M2 j/ x! H# f A =
5 ?+ Y- V) V) O$ l2 k2 i9 u S: ?: Y 8 1 6
- r3 m6 U! e5 x' w; {, A) y 3 5 7' H ^* k h% C$ L) U% M
4 9 2
/ _9 Y K! P; W) }# i% ? >> B
, \9 t1 e ]( V B =
" k9 J% K- |6 { E 0.9501 0.4860 0.4565
) H3 K* L Y5 ^! I8 T 0.2311 0.8913 0.0185
" r1 _1 ~' j7 r) x 0.6068 0.7621 0.8214
3 L) Y5 } y# n# ?- f8 G >> clear% v, K4 M X& L; v1 R3 i
>> open('matlab.mat')
: S+ {, D" H4 G ans =
0 l6 g1 B* L# N* V% v A: [3x3 double]
/ f- b8 G, \2 u& p: o4 J! ` B: [3x3 double]
8 j+ v; ~0 d' [7 e8 I) I5 V >> struc1=ans;
6 ]. ?6 @7 h5 E% S1 J >> struc1.A
, [4 \, U6 _! Z1 O6 s7 | ans =
2 N! X* x0 d; K& W4 Y {# a6 E 8 1 60 D5 n/ u' f; h+ w' x* ]% D
3 5 7
! y/ d% x6 \; S% m7 U# _ 4 9 2 R! }: O' t. b! L1 k$ j7 R
>> struc1.B
1 b4 Y1 `) ` k5 O$ \9 _! u ans =
0 M7 R* w: H' I8 ]2 f 0.9501 0.4860 0.4565
- b; {; }/ E+ Z5 U+ O) n 0.2311 0.8913 0.0185+ k; N; n! N; t$ S V8 G( _
0.6068 0.7621 0.8214* l3 u7 l5 O) @8 F2 {5 T
13.2 文本文件的读写
2 S: r! t8 _" j$ E$ A+ }! u# F 在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
3 \2 A( ]1 x! W MATLAB中实现文本文件读写的函数如表13-1所示。5 X! \* d3 v. m3 M, K& r- V& n$ A
表13-1 MATLAB中文本文件读写函数
f. H- `% z' `, t" g函 数+ x t8 J* B) ^" k# K
功 能
. r0 ]; P5 E q$ v3 N* E: ncsvread" E$ }) X0 |- j0 H3 B: n( q
读入以逗号分隔的数据
5 p0 A# r# L# n' Rcsvwrite( `7 M1 d) v* D, x; } H/ j( `
将数据写入文件,数据间以逗号分隔, [9 \, }) T1 u% j% z) Y
dlmread8 P: h) C1 {; j& `# [8 B9 B
将以 ASCII 码分隔的数值数据读入到矩阵中* P. G# g P7 n6 x& H6 R
dlmwrite+ D+ @" S* F. S& O R. V$ t
将矩阵数据写入到文件中,以 ASCII 分隔: }' w6 }2 U" o. o) ~! @
textread& B% S& v1 X( [" X3 f& J
从文本文件中读入数据,将结果分别保存/ O/ }# ^! l. a0 x3 ]3 P; P7 H3 W
textscan7 P+ n4 J! W( E* u
从文本文件中读入数据,将结果保存为单元数组
' Y7 e3 ^2 l0 C6 Y. a
7 g2 j7 i- I6 R7 ~& i 下面详细介绍这些函数。
( V9 D; e3 k( r! _/ S0 L 1. csvread、csvwrite
/ [2 d1 \3 |) U/ n csvread函数的调用格式如下:" q4 i: ^0 a3 N* S$ r1 T
● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。: ~( W6 Z, b* j2 m
● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。
0 S0 [) l* g9 `● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。7 M) Z, y/ d* D2 M9 `
csvwrite 函数的调用格式如下:
+ R0 B5 G: V5 `9 A7 b8 D1 h9 @5 K. j● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。. P2 L6 t. t: h/ b! W& M) `
● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。
" r; w, i# I/ M1 X- [% M● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。
+ ?: ~3 Q' D3 x: P6 l8 j# ~7 {; S 这两个函数的应用见下面的例子。3 H7 q# w X, y5 Q: W
例13-4 函数csvread和csvwrite 的应用。2 V j) ^' O z
本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。
6 }6 l3 w, m. q6 |# N3 F 编写M文件,命名为immatlab.m,内容为:4 k \+ ^, h0 l9 f$ K# F7 M2 ~9 @
% the example of functions csvread and csvwrite9 u: n" U$ v9 R- W
I_MATLAB= imread('D:\matlab.bmp'); % read in the image/ ~% ?- b" h3 T3 v: A
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image
3 s3 x% f! m$ l' ? figure,imshow(I_matlab,'InitialMagnification',100); % show the image$ R9 W( D/ c* n0 X; C
csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
+ a; Z) k' K4 T; o7 y* `. Y2 _ sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
4 D% i( c0 y. Z+ y sub_MATLAB= uint8(sub_matlab); % convert the data to uint8: W8 d% e5 a# j% `# B
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image! ^( d! `" _: @! E
在命令窗口中运行该脚本,输出图形如图13-2所示。
3 R4 [4 D8 Q4 \1 W( C0 M* ~+ x; f( W
(a) (b)
G- ]% K4 o- [! L- B$ U图13-2 例13-3 的运行结果
+ r' c" M$ A% t- g4 Q6 k 该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。# d& L4 f) ]) q n& r; e
2. dlmread、dlmwrite(个人觉得这个比较好用)* d( x( N3 A8 Z" s8 {0 X2 p, s
dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:6 Z* y& z! s& F& P4 X7 k9 v/ t7 @
● M = dlmread('filename')' t# u. v3 ~4 A! h$ X7 b1 p8 w
● M = dlmread('filename', delimiter)1 b2 q: M1 Q+ H9 g9 n5 u8 c: j: C
● M = dlmread('filename', delimiter, R, C)$ p \+ B; h" Y/ Q/ Z+ i
● M = dlmread('filename', delimiter, range)- V( p6 W! D: |5 z
其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。: C! f( J% Q2 g
dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:5 H' v Q0 B$ B) H2 R
● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。
/ q' {" L4 G& d- O4 D; \8 v" x/ @● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。4 ^- r, f; H9 W6 F, K: B
● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。+ T; I' g$ T3 x
● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。
3 ^% q; G. m' o( s' N● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。
+ l4 i: S2 e0 h9 P9 ^$ b4 Y● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。
7 y) E; P7 [" K7 {7 F● dlmwrite 函数的可用参数如表13-2所示。5 @6 E% B+ Z/ _, l
. m3 V' @" b$ H+ R/ }3 o
. V e6 ?$ @! X6 w" n4 I6 ?表13-2 dlmwrite函数的可用参数) j. _( M6 Z2 V; W/ j
参 数 名
0 R$ t7 S$ [5 W G7 ]9 c1 p3 S功 能
! \2 R' ?8 _0 I6 u1 U: [; c3 ddelimiter
; G5 D0 f1 b% ^3 u! a用于指定分隔符
$ ~+ U- @6 z' p$ B; cnewline8 u6 t, a) d- X1 i5 u$ Q
用于指定换行符,可以选择“pc”或者“unix”
; h9 z% }. J& o1 e8 q3 g+ M9 Sroffset a0 h) p5 J. e& O, q: s
行偏差,指定文件第一行的位置,roffset 的基数为 0
- |# u( ?! k) c1 q5 hcoffset
, ^1 N; a! K& Q* w/ ]列偏差,指定文件第一列的位置,coffset 的基数为 0 h7 k/ ]: v& Y: H- M
precision& r1 @2 G' R% {4 h7 }! T L0 {1 T+ @$ `
指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”$ g& P1 r+ N0 ~5 h
; i3 U) U' B; W7 s
3. textread,textscan4 ]3 f- ?. j+ M% f0 F1 O
当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。
- k& d0 e3 }3 f$ \ 例13-5 通过%读入文件,按照原有格式读取。
7 S2 ~ A1 S8 {3 {文件的内容为:# y: w2 i5 x& q* H6 _4 ^
Sally Level1 12.34 45 Yes
5 u+ X/ J* z4 V* g% j在命令窗口中输入:: @; i. H6 B. q- i5 I0 I- U# H
>> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)
. | A& T J/ A" Z得到结果为:
; W. B U. P A# I names = c- B+ O" w; j2 y0 e! ]+ Q
'Sally'0 g+ R7 c' o* U g4 Z9 i1 W
types =
0 ^( `& v, J' l3 L 'Level1'
/ B6 M6 ~8 @7 S" D x =7 z' O# G1 t, l( N S0 `/ G* f
12.3400
4 g6 F) \# J" A: l; R% x- ]& x- {7 j y =7 x- t. G$ C+ k8 Z' u
45
2 g i# S( Z* ^' ^/ } answer = / t# M* f# s# I; L" T W$ E+ h a
'Yes'2 ^2 M5 }4 r! Z+ \
& m) U$ b# O% A4 d0 ~/ f p( r
4 Y. o0 k, S# G0 T5 A# w$ x 例13-6 函数csvread和csvwrite的应用
2 | L' `( ]8 a. I1 p u" J Sally Level1 12.34 45 1.23e10 inf NaN Yes. M" Z* d; Z9 M& j' \! z" M4 @5 {
Joe Level2 23.54 60 9e19 -inf 0.001 No1 m! l1 h! k) S7 c6 e; I
Bill Level3 34.90 12 2e5 10 100 No& r4 v1 i9 _3 s5 I
>> fid = fopen('D:\mat.txt');
% Z' x8 U: ^, q3 z6 h >> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');
9 y: S9 V& p% T7 l {7 c; m >> fclose(fid);
E" {) A x7 ^! N13.3 低级文件I/O
8 r& l2 E$ ?: }" y- r8 d 本节介绍一些基本的文件操作,这些操作如表13-3所示。
! d' E2 n/ g8 x( h- y表13-3 MATLAB的基本文件操作
2 i* p7 E% K% D1 N2 L. i# O函 数
( `8 O9 S# M2 j) U" K# H* U功 能
- t D3 m( F3 `% J$ k fclose0 l( ?9 R/ O+ Z# ]& P
关闭打开的文件: j/ B; e) v. i
feof# V% b: }6 e A7 f' r8 W P
判断是否为文件结尾9 u+ b- m8 t4 H( B
ferror6 F# P6 y3 n7 c+ G2 W
文件输入输出中的错误查找; j9 n2 h1 Y( ?7 w% O( o* U/ w
fgetl
# U, m5 t5 z* w; ]读入一行,忽略换行符
) h6 @+ t# m& f1 F0 v" { fgets
$ X+ G% p! N! S$ g% e读入一行,直到换行符
3 o+ u0 P, v# u" q fopen
" G. l% l& i7 S打开文件,或者获取打开文件的信息
7 ]* ~0 C [; i fprintf. ^$ f$ F- \" X/ K# ~& e% z
格式化输入数据到文件
4 W* ~+ R+ P, J fread* s, l1 P& d+ V& p# H9 a# o
从文件中读取二进制数据
7 l2 ^" t0 P4 e6 v9 a: U# N: W; k, K frewind
6 i! \1 d8 Z: W% C C% F将文件的位置指针移至文件开头位置1 Y: \! K, E1 i9 K3 g& ^
fscanf. I4 a2 |4 E" C
格式化读入
4 q0 }6 R* y4 D7 m n fseek
: L" ?5 J" O- r: o" W2 N/ ~1 K设置文件位置指针
& U) P5 ~) F, `& x2 V" b ftell) s" H8 L7 b( p9 h+ T! J- e; |- z6 s
文件位置指针 b6 x# I! T, u' W
fwrite/ W3 l2 d8 A; @6 C
向文件中写入数据0 l% F/ C2 j, R# n( ^' a
0 t- [5 Z: K4 Y( @1 a
下面重点介绍函数fprintf。该函数的调用格式如下:2 a+ G: C8 s( Y) y2 t* ^
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。
8 v% h4 [1 g/ h4 ?! ` 上面语句中,参数format由%开头,共可由4个部分组成,分别如下:7 ]3 c* x5 V$ Y
● 标记(flag),为可选部分。- a3 p8 l/ f" x( ^
● 宽度和精度指示,为可选部分。$ T X/ @0 D% O# s D
● 类型标志符,为可选部分。% G- t9 ^3 z5 P5 Q% e
● 转换字符,为必需部分。7 f% X0 B$ K9 {
1. 标记
3 H4 ~7 y( J0 K0 ^$ ^- } 标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。
7 y7 B8 t. ]( I: Q& J表13-4 标记的可选内容* y- [2 x) Q3 `+ J+ {, F8 l; u
函 数% Z3 Y% N z/ M6 T+ p3 `$ X5 A3 F
功 能
# s/ V/ {6 R Z/ c示 例$ ]( \0 `5 ` m4 z
负号(-)
+ x% u' s& i1 b5 [ 在参数左侧进行判别
9 k. q: G# ]* p) i3 w+ n %-5.2d, N- T1 U2 L+ G2 F \
加号(+)) |5 x' e% T, U+ l1 Y
在数字前添加符号
/ b) ~5 K% d8 y5 }# O t1 C& F %+5.2d
2 N) x- W) h4 b/ t* K 空格
1 B: Q: C% S+ D; C! [5 c 在数字前插入空格8 J6 K3 E1 \4 V: e3 ]
% 5.2d
+ C) |) b3 C; S# g" ]- V. M0 y9 k5 ? 0
- J9 V8 i, P+ q4 j 在数字前插入0
& s( h/ X% ?8 g5 U' k, `" ~ %05.2d7 @( j, f4 f& g) z0 d0 t
2. 宽度和精度指示
! M+ L! D2 U c 用户可以通过数字指定输出数字的宽度及精度,格式如下:
& l; d# p4 [8 J7 \● %6f,指定数字的宽度;
- I1 a* u7 O% C7 k% s0 f9 D● %6.2f,指定数字的宽度及精度;
p& {" I- J0 w- s8 v● %.2f,指定数字的精度。
( k2 j, E* s- j4 F" v例13-6 fprintf函数宽度和精度指示符示例。
, D" f2 u$ V- D2 @) q 在命令窗口中输入如下命令:2 ~/ }: S* `5 @# V6 \" I5 I U1 }
>> file_type = fopen('D:\type.txt','w');( e0 j6 n, y3 C4 s! C" i
>> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3); E& C. X1 b: a5 i1 T9 a
>> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);2 j% k$ I+ P5 Z: A _0 z' y
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);
: k6 l* c" M' f$ ~9 B; J9 d: h' K, l >> fclose(file_h)
* O; \$ P& A% A d% P, z. I+ X ans = R0 g, F# F" {/ U4 {3 t
0
" {( D4 r! s; R; I 打开该文件,其内容为:3 }5 H# Y0 h3 A! ~/ i* V2 n
1.20 -43.30000000% g* `* c+ m5 E, c4 U
1.200000 -43.300000
y F: a% _( C8 n 1.20 -43.30000000
. P s2 L( N5 O8 t 从上述结果可以看出宽度和精度控制的效果。
* y- H/ Z' ~6 h& J 3. 转换字符
" }+ r7 r) Y+ `3 C4 Z6 g 转换字符用于指定输出的符号,可以选择的内容如表13-5所示。& y5 r O% ~) N
表13-5 格式化输出的标志符及意义
W: I q G: S标 志 符) _" d3 r* f) a$ O& x: I$ W5 {: W
意 义
/ }; J- z8 f) I* N& T! T/ D %c+ z/ ~2 h1 w: |5 z$ M
输出单个字符2 H1 Q. W: q( t- d" T% Z# z
%d* \4 i5 l+ P: r' t3 B
输出有符号十进制数8 T* t2 t2 A4 ?5 C; p
%e
" F8 q0 o) q& {% a采用指数格式输出,采用小写字母 e,如:3.1415e+00) A- O5 R% W0 F( ]5 ~( X* p
(续表)
' V0 N) {" s" K( q8 i; M8 a1 q1 B1 F标 志 符
* c& M( j, }8 I0 m- X意 义2 r& _; G, v* N/ q X" ?
%E) @& j( K/ j) H) i2 f. Q
采用指数格式输出,采用大写字母 E,如:3.1415E+00, `8 h# o3 z, A
%f4 h5 X+ E4 h! i6 M0 n: Q$ g" P
以定点数的格式输出
) a/ B6 Z* m8 }. G: r1 {: X %g- |% h; K4 a8 k& O: W( M
%e及%f的更紧凑的格式,不显示数字中无效的 0
6 ?. U9 b5 x E2 d D" I %G; t1 I8 w; M) q- x3 J, f! K
与%g相同,但是使用大写字母E3 ~* U0 W- Y' n' n4 R' `2 U
%i2 B/ }/ q2 j) U* j
有符号十进制数 f8 |5 E: L; F4 Q
%o
2 K3 Q+ |5 Y. t0 y I无符号八进制数
& K- m9 `" J4 c( E %s
; T( Z% r0 w# ^; b, s. A输出字符串
) d. | \& ?' Q, s, v2 ] %u
3 S$ q8 Z, Y1 d5 G1 u3 W" ?8 k& J无符号十进制数+ `- P- m% u: e |0 ?4 k
%x
1 i) i( j+ y/ x十六进制数(使用小写字母a-f)
# [1 A! T/ m* N L0 O- F %X; s9 X4 {* {. x* b, C& A( [& h
十六进制数(使用大写字母A-F)
. ~7 s7 D2 \! h7 S * `* N( M9 K1 k6 ?
其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。
5 F* I! t/ ]7 ~4 c. P3 h例13-7 fprintf 格式化输出示例。" ]* d* S' _$ H. V( |5 V/ j
>> x = 0:.1:1;! l4 C: u+ q- B+ W
>> y = [x; exp(x)];
( R0 _8 B/ S3 w9 u( J9 } >> fid = fopen('exp.txt', 'wt');* d* e, {2 \; V. ^
>> fprintf(fid, '%6.2f %12.8f\n', y);
3 E4 U" t$ l w" S6 [" j0 } >> fclose(fid)4 N# ]$ m' F1 m' b, T9 O& \8 I
ans =
j' Q/ J0 V/ A" l% G. X 08 R+ a* ~! f6 o$ P# B, t
显示该文件:3 |' M! m. k3 L% w* b/ i7 R2 H
>> type exp.txt7 h7 ]6 M" [! K4 D4 c7 q: _ q
0.00 1.00000000* C j) C" ]4 h9 _" j
0.10 1.10517092
. j0 E' ?5 [0 C. i9 M3 j: \2 c …
9 M4 x, c) P. o6 A 0.90 2.45960311! b( [ _& W" C0 Q
1.00 2.71828183( f5 g. W; Q& M. U5 R6 W
例13-9 利用 fprintf 函数在显示器上输出字符串
% W. X7 p! m7 d& p4 L >> fprintf(1,'It''s Friday.\n')# d( K! u" Z% j- T
It's Friday. J2 r* {- t. N
在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。
4 O: U# V `# M: d. l0 P: y: O , J% b/ U* P7 D8 F
o$ G3 V" O, X表13-6 MATLAB中的常用转义符+ P8 o, ^9 i: ?, y
转 义 符 O) `" l: H; B, v. S% K
功 能
9 `$ t# H( V3 T3 ^0 X& j \b 退格
1 G0 t5 w c. L5 i0 p \f 表格填充) [+ e9 w. b( e5 R6 g1 d: @, @; q
\n 换行符
6 U& {7 T/ z# V$ k2 U5 W \r 回车: M0 ]6 P- e( n8 l% m; }0 D
\t tab# V4 l4 s- I' G5 R3 M
\\ 反斜线
+ y0 x5 K4 H+ h8 E# t \'' 或 '' 单引号
% S& T" d4 X5 Y: K7 j& v6 o: i %% 百分号
* x5 [1 F4 Y D7 a( v( U13.4 利用界面工具导入数据' s' L! L- @) ^# x" C& y5 ^8 |
除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。
- A; j2 b' n! {+ G8 O8 ^0 S2 s 选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。
9 v8 ^" ]- t6 q- ?3 l" Y0 e9 c% H
& }. q0 q* ?0 g# W" g8 A |
|