- 在线时间
- 5024 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2009-4-8
- 听众数
- 738
- 收听数
- 1
- 能力
- 23 分
- 体力
- 77459 点
- 威望
- 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 的帖子' V- U( S2 v! g+ G) J$ S1 i% m- l
/ s9 r: i: _ N# b
% t( j; ^* h5 M& b0 |, v6 I8 v 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。
7 e: K5 _ `2 o! a* `& A0 q: g& q: M8 B: \8 a
13.1 数据基本操作; O2 F8 m( b# L, y8 p. Z
本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。
2 y2 M% M. e( P; l) [$ V3 N13.1.1 文件的存储
6 j5 C& Z& U6 l, |, ^& T MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。
$ b8 q) m1 g8 I3 ^3 _% X 1. 保存整个工作区
+ V. D; C) E( ~, } 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
3 i$ v( o/ ~! @. E( v; d 2. 保存工作区中的变量
0 F6 l0 M1 G# g% k' O 在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
, |7 S6 k; t2 n7 ?! C/ v: @& a0 M 3. 利用save命令保存
* E/ u3 E7 C1 q3 K* Y 该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:
" d: C* D- y8 A* }1 ^6 g5 }● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。9 M" g$ a) o% K$ N4 ?
● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。
2 H& T- h- O( F i● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。 U" a3 A5 k1 ]2 U& @! G
● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
* p+ h, e2 L" [5 T● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。% L! Z( A4 u$ z! J/ h- f% u
● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。7 }6 l, N! |- _4 c& B8 l% \
● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。
% _! }4 `, I6 y* y4 ]. _13.1.2 数据导入
1 r2 u" P* f4 B: D8 n" @ MATLAB中导入数据通常由函数load实现,该函数的用法如下:5 p1 j* j2 B/ U8 G
● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。+ }( I' Y" B2 w3 d
● load filename:将filename中的全部变量导入到工作区中。
1 j& I; N- {3 H! M7 ]● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。" [% d( \6 H" `; s. J
● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
2 U8 e8 c! S+ b3 ]* x- _● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
: r% ^ }- n/ y6 I* ^# `% J1 A9 W● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。6 s2 a+ z: B& p
例13-1 将文件matlab.map中的变量导入到工作区中。
1 D3 r7 [% S6 U- c+ R& v9 z 首先应用命令whos –file查看该文件中的内容:
9 g6 z. g( ~3 w9 n' k >> whos -file matlab.mat
4 {* A4 u7 d2 _ Name Size Bytes Class# o4 a; L& `9 t# A( v1 g
A 2x3 48 double array
3 O, P, ?1 z/ c. C4 Q* { I_q 415x552x3 687240 uint8 array
2 Y3 q M2 r" }3 H: ^, T ans 1x3 24 double array
$ \ b9 X A1 Z J' k/ s; Q num_of_cluster 1x1 8 double array
8 l' R, J% q' Q Grand total is 687250 elements using 687320 bytes
: G: d0 g9 ~8 R 将该文件中的变量导入到工作区中:- y; u' _2 v& F$ q% |" W, w
>> load matlab.mat2 w9 `( \' Z; h p
该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。! } I. A6 w8 k: N1 q
) @- |. W b4 @) Q% T/ J图13-1 导入变量后的工作区视图
$ i+ y5 l9 x- `2 D8 e7 } 接下来用户可以访问这些变量。! h0 d5 D1 O ]/ x! M" d1 A
>> num_of_cluster
& N4 N" E" a4 G% V0 L num_of_cluster =
2 L4 l9 G3 R8 {- d6 u( c 3
0 Z# H1 H2 L, y MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:5 j1 |5 B" u2 N7 n
● importdata('filename'),将filename中的数据导入到工作区中;9 Z N8 ^% F6 v" p- v' f5 G
● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;/ c% a1 a0 C- a9 f, C3 R1 v/ @
● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;
4 [& X4 G8 W% w5 I$ |例13-2 从文件中导入数据。4 e, P1 U8 \! H0 |6 S; a7 P9 |
>> imported_data = importdata('matlab.mat')) e* o w' ?- \( K) X
imported_data =
7 H, U, T, d! d- o4 d; v ans: [1.1813 1.0928 1.6534]
3 Y& ]) _8 ~$ v" W* f0 u; r0 `- m A: [2x3 double]
9 t+ S+ c" P" M% s8 K4 G1 [! J I_q: [415x552x3 uint8]0 s1 D9 t1 |" V! x
num_of_cluster: 3& `8 r3 n$ `0 ^+ g/ J
与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。
0 }9 p% Z/ M& J) { X13.1.3 文件的打开
- L+ k% Q5 c; H MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。
9 R- Z# [+ _/ |( s9 e6 z 需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。" M5 m1 ?( T" }/ @; ^+ e! `
0 J/ M. r1 F: G例13-3 open与load的比较。1 ^9 W. f, f- C: n. w) X
>> clear3 j3 y: ]' e/ x
>> A = magic(3);5 s6 Y% z% m5 D" j7 H( |
>> B = rand(3);, ?6 l# x# K4 l' r. I
>> save
' l; I' d* m& K7 Z. k: z Saving to: matlab.mat
4 g6 l6 V. h W v5 c; G >> clear
" R7 o* Q; x. X >> load('matlab.mat')1 b# e. v+ t; C: j& F1 ]/ Z
>> A
0 e2 V/ M# K3 H A =8 d& u1 [) d$ C
8 1 6* s' P2 k9 P3 e! L1 A
3 5 7
0 M0 L' `1 ?* u( }: B+ y 4 9 2
5 q Q% ]+ g+ P! @ >> B) L: s5 ^( T2 n* d+ T
B =
! Y- ?4 U) L3 k1 Z% |1 x0 j 0.9501 0.4860 0.4565
- r. p0 Y( r8 W7 J* N" K! e4 S 0.2311 0.8913 0.0185/ p7 p/ y. ^4 \3 e
0.6068 0.7621 0.8214& V0 T7 M1 F! `7 _
>> clear3 q& _' v1 M+ E8 i( L+ _
>> open('matlab.mat')
C4 A! l2 L/ ^8 N0 b& ^" s ans =
8 T4 P+ d2 L! S A: [3x3 double]: X( S! j# c! }2 ^/ {) [. G0 x
B: [3x3 double]6 s r6 E% E. q$ I- A
>> struc1=ans;8 }9 j, m A; l$ h' K) n7 d) @
>> struc1.A$ U: s% E3 N0 f. X( A7 b; k
ans =
5 P. I) X& }$ w2 u% l5 m 8 1 6" m$ Y$ \7 X5 [3 b9 W
3 5 70 ?% i2 }( T+ a% m, p
4 9 2/ Y. i* n. {' ^: w- i. ?# r; Q
>> struc1.B0 h7 j, S2 t+ U( W+ o a+ o6 Y
ans =
+ @% F8 F2 U! k, c C 0.9501 0.4860 0.4565" r# ^2 N) }# e- O" j `: ^0 o
0.2311 0.8913 0.0185
M! L4 Z* j* } 0.6068 0.7621 0.82149 j. }3 Y+ e, C1 D
13.2 文本文件的读写, m+ Q& Q0 W6 f6 e7 G- [
在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
" V1 y0 o5 Z$ U2 D MATLAB中实现文本文件读写的函数如表13-1所示。6 O* ^& F3 |1 ^4 }& U" T5 Y9 B( B
表13-1 MATLAB中文本文件读写函数
7 L( r& O2 k1 `9 q; Y: G% Q# R8 R函 数
# D% @8 ~' @; P. ?功 能
" Z) r) Y! r Hcsvread- g$ H6 _5 q0 \5 n( k& G& f
读入以逗号分隔的数据& F& C3 e5 Q0 P; j9 e
csvwrite
' k9 t; C3 r% w/ Z2 |" ~将数据写入文件,数据间以逗号分隔
. o" j7 z* h l& H' Ldlmread
. g( J! O8 e8 w- D5 `将以 ASCII 码分隔的数值数据读入到矩阵中
k6 J3 U) O! }7 \0 cdlmwrite
" E2 F6 W+ c% m1 c( P9 u* {0 |7 L; G将矩阵数据写入到文件中,以 ASCII 分隔* b' F! U% Z9 n6 N& e4 \
textread
$ i$ f* k: p/ x6 s# |从文本文件中读入数据,将结果分别保存
7 B( _& x5 g* Q! itextscan
/ y, n3 G3 V& x0 P# y6 ^从文本文件中读入数据,将结果保存为单元数组
$ d: U# P+ Y! `3 {- k: r " ]& }' M! B" D( D; {
下面详细介绍这些函数。" e; N, H1 g8 W: C: K2 q
1. csvread、csvwrite7 I% ^9 ?- i$ M, S
csvread函数的调用格式如下:
3 i) @# s2 F' X$ H, ]● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。
+ ~0 i$ _4 y2 l● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。# S: k. l& n7 p, h* w
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。9 i+ ~1 o! C/ I9 z/ C- Q
csvwrite 函数的调用格式如下:
4 b8 z3 D' M& g- C: k1 }● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。
: w+ R" L5 [6 O9 v. L● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。
$ g; E3 E2 K7 `# J& _ ^) [. T! U8 \● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。
% O; {- W- [& j 这两个函数的应用见下面的例子。
1 ^% C$ P5 u% a" y4 {2 { d p3 T例13-4 函数csvread和csvwrite 的应用。" j. T- W5 x0 J! Y
本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。
1 k" E( g* M W: w 编写M文件,命名为immatlab.m,内容为:- I% \! L: N- I* s2 z1 @8 n
% the example of functions csvread and csvwrite
4 V& M i# P, ^- G& D9 r7 ?) |- O I_MATLAB= imread('D:\matlab.bmp'); % read in the image; E! g9 y/ i: G6 h. N
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image: \7 J9 X6 s! I) t R
figure,imshow(I_matlab,'InitialMagnification',100); % show the image
8 |' k' ], @' O9 P, L csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
. _7 f2 f9 k: E! x$ U$ l% R sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
0 z5 A+ g1 f3 T& Q N sub_MATLAB= uint8(sub_matlab); % convert the data to uint89 [5 [# K0 N3 K5 Z
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image3 r2 P; ?4 w) ?" B8 X; @
在命令窗口中运行该脚本,输出图形如图13-2所示。' o6 I$ C t; B5 l O
! O: D: X S) b/ |9 H( w5 x( Z(a) (b)( X: N; t4 A, h: f
图13-2 例13-3 的运行结果8 i* ]) }5 \; t* r3 \
该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。0 K9 ]6 l3 N3 j5 p
2. dlmread、dlmwrite(个人觉得这个比较好用)* Z2 n! t1 H3 G
dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:
4 N+ P6 F5 o" E' w8 w( m● M = dlmread('filename')
D8 Z1 w! v, x& D" G. H● M = dlmread('filename', delimiter). L- W4 X: q3 C3 T3 I% I
● M = dlmread('filename', delimiter, R, C)3 w7 X5 D! }7 E& G
● M = dlmread('filename', delimiter, range)* r2 _+ r' w9 l& ~1 s7 ]
其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。: M9 ~: d. j0 A1 i: ?
dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:
/ r* o- G: Y! N# F" j$ l● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。
8 Z1 z% T! E5 e; p5 T' i: }● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。
+ F; O% k: b b. [7 x. t, A● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。" N2 s, m" W [
● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。0 }: N/ q% @7 |) ^
● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。
3 h+ d( \0 E! G. }● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。6 g0 r! s2 H, R! ?& f7 n+ j/ \
● dlmwrite 函数的可用参数如表13-2所示。
" y7 m8 A: F. P1 o0 \1 T/ j5 F- m4 r M7 ]
0 a3 m! l$ D* A% B表13-2 dlmwrite函数的可用参数
9 X% A( f1 ]8 B$ B1 O) T. @5 O$ I参 数 名) Y3 W6 F' w! E4 l8 E1 F- a& `1 o& ?* m
功 能
) |) n/ S( E8 F; rdelimiter5 P9 O! o- ?' b; W$ r
用于指定分隔符
/ M" w- e3 w8 l% v3 ^0 D4 Inewline5 z5 k3 p5 z, K1 D
用于指定换行符,可以选择“pc”或者“unix”* l z: ^$ j; m$ v
roffset
6 c$ D, L" k4 p$ b2 i行偏差,指定文件第一行的位置,roffset 的基数为 07 V4 K! X( L) X& u% E
coffset
- X0 @, n- i9 `. ~: y$ @. h列偏差,指定文件第一列的位置,coffset 的基数为 0
: r9 R$ F" D2 o; k t: d7 gprecision
0 G3 f8 P, o, J. O" i: R" m" e6 U指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”
A6 R1 J! s, y3 O * {. C' m$ U8 K! B
3. textread,textscan" i- {, R* g1 n" O' _7 t# H
当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。
0 f$ ^! n( b3 g% } K1 N# d& K- t 例13-5 通过%读入文件,按照原有格式读取。' o$ o* z/ y; J- O! Y# G
文件的内容为:
% a2 a- O- u+ R$ | Sally Level1 12.34 45 Yes: v' I) f6 x+ A% z5 m) L( V
在命令窗口中输入:
" c2 ~; T0 e) u& Z# X4 f8 e: v" f >> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)
+ @9 e. [& p+ M( P得到结果为:( S7 u/ g3 O% i- ` X* b4 G
names =
/ s4 `2 P6 D0 V* N9 r1 W+ g 'Sally'% R# D3 I. R; j4 X
types =
* Q8 q8 y$ g% z3 u 'Level1'
4 s2 d) `. x0 J2 b4 D& P- E x =
" V+ u0 | d3 } 12.3400
% \0 y k6 F6 B y =
3 }2 y" N. x" \* q5 @ 45
; \$ X4 }; u& l answer =
" a7 J& z, `* \* C4 X& X- P7 P 'Yes'7 H, D$ K& Y# ^: O2 {/ }
! i! f/ x9 b- V/ l7 U V$ a# R j# A
, A3 l+ h; ~% E# e( m 例13-6 函数csvread和csvwrite的应用 F: ?7 ~3 a0 Z( Q( B3 p- E
Sally Level1 12.34 45 1.23e10 inf NaN Yes
- ~( Y0 r% W% b1 D5 ?: f Joe Level2 23.54 60 9e19 -inf 0.001 No" f6 A2 z& S% g
Bill Level3 34.90 12 2e5 10 100 No; |: l8 i* a( h) a4 N2 d# Y
>> fid = fopen('D:\mat.txt');
- q7 k& b% @% ]/ x2 O- Q >> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');
) g4 f# A. r, k, `& @ >> fclose(fid);
3 m+ j3 _9 T% p; [5 ^: R13.3 低级文件I/O3 I0 \9 _" g. J
本节介绍一些基本的文件操作,这些操作如表13-3所示。+ k" Z0 _7 \% l+ P! M0 T0 d
表13-3 MATLAB的基本文件操作8 O3 k: R, D! s# i2 g7 u9 e
函 数! I0 |1 Q0 t# F0 o* V
功 能
, d1 ~5 M6 d3 H7 C2 g fclose
3 K' J- v# f6 {: |- A' \: }* Y- o关闭打开的文件+ K' L0 l) Z3 s9 V; m- K
feof
% P. L+ U% r6 L8 E- p判断是否为文件结尾
; E7 \2 j4 g$ v4 e' D/ i& V. O ferror
, [! E G3 U2 F7 D5 z7 S文件输入输出中的错误查找
' |2 h3 o6 N* P) L1 @ fgetl2 T ?5 A+ [% O$ ^: G) t4 h0 a
读入一行,忽略换行符, t2 P- B0 b1 |, O, u& b
fgets& ?$ V2 x; ?' D# j2 c' r! r [
读入一行,直到换行符- A3 k4 `. ]0 t2 z+ a3 @4 X9 g
fopen$ C3 ?' |1 d$ _3 |
打开文件,或者获取打开文件的信息
1 P4 L* G1 m/ {5 F9 ^1 [ fprintf2 h. y3 n. H& q, D
格式化输入数据到文件6 {( V) \- L& Q( n. \& p
fread c0 X& z1 A- D2 i; E
从文件中读取二进制数据/ `" P5 m9 |: G4 B+ W: C
frewind, _0 \! F: k* O7 r2 X5 O
将文件的位置指针移至文件开头位置
7 G9 [. |9 G: Z% C8 T6 d fscanf* A$ Q n* L8 U! l% `0 F9 Q8 q
格式化读入- G6 n: n! b' n
fseek
: a U1 g' x& M1 C. c设置文件位置指针6 t. }7 ]2 ]8 g$ Z
ftell
3 b' o W6 d3 s文件位置指针$ w" ]7 T! p& v2 Y
fwrite" x8 p- W9 k3 ?* {' G6 _" V
向文件中写入数据
; a. i9 a/ }+ F3 l% | 0 \+ E) B8 z6 f/ } u/ j
下面重点介绍函数fprintf。该函数的调用格式如下:) ]* A, b$ @* z
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。3 D% h; p0 w, r& d* N8 p# b
上面语句中,参数format由%开头,共可由4个部分组成,分别如下:
Y1 L( z1 F% w- a4 Q; m8 C2 \& N& j● 标记(flag),为可选部分。4 b4 I- q( D7 @4 \" \% r5 ?
● 宽度和精度指示,为可选部分。
" p* N' O. K) N% M● 类型标志符,为可选部分。
5 s6 K+ j3 F3 o7 @& d! ^. R● 转换字符,为必需部分。
( p" W1 p8 s& n2 W4 {* ~ 1. 标记8 q2 A2 I; ]1 s. ]6 t/ a
标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。
1 Z7 Y% `6 l- Z0 a/ M3 l) s9 d表13-4 标记的可选内容
" E% |$ t3 x$ y7 t* }函 数
8 m, g4 m4 w0 `* P4 N9 }7 [功 能
/ S3 u v2 W- c示 例/ a+ L+ A* D: i7 Z9 Y/ @
负号(-)$ t# j8 R! v* j: W+ A1 T- a# V' W6 d
在参数左侧进行判别
/ k5 I0 K6 V& R a4 J %-5.2d ]0 z1 c0 }9 m# j" e5 F5 G( f$ g, h) ~2 \
加号(+)' P% h, c+ C r6 V' i. l( d" e6 ~3 W0 ?
在数字前添加符号: Y6 ]) [1 G8 E* Y
%+5.2d
4 s8 _1 M" _& P1 q 空格8 b3 @- G9 y$ y; d6 D/ d7 ]9 Y
在数字前插入空格* H7 {! {4 O: ~0 ^& O: L7 M
% 5.2d4 D4 i& r. r' k `
0% J# D- z, Z2 X9 b# A) [
在数字前插入0
# V) y' u0 \+ L# o: A. { %05.2d- p5 u5 w, w/ W3 J; E
2. 宽度和精度指示5 p+ J: j7 Y8 B( A. F1 e' V
用户可以通过数字指定输出数字的宽度及精度,格式如下:
4 I. g% [ x( Q$ B● %6f,指定数字的宽度;
5 z1 R. d. U( h5 |! D2 H● %6.2f,指定数字的宽度及精度;
4 S! e* c9 w: F1 _; B● %.2f,指定数字的精度。1 a& V& i8 u8 R' {: H: a
例13-6 fprintf函数宽度和精度指示符示例。! V6 M1 A, N* k' Y6 E
在命令窗口中输入如下命令:0 ?$ D6 {0 B9 q" u" x
>> file_type = fopen('D:\type.txt','w');0 ?- o3 Y% s* _5 A( V7 |
>> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);
- y7 Y2 Q+ j. F! L, V >> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);6 m8 O# K# [; @% O6 h' w
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);" ~: b; U/ B& ^; _5 @8 y
>> fclose(file_h); B! p# j7 n- r: p
ans =# D. ]& x4 W: c6 q) Z
0
! ?* q7 y* |" C; P% y) l% ~ 打开该文件,其内容为:
5 N$ s' B( I7 E) x 1.20 -43.30000000( ~# U7 q3 \. y- I
1.200000 -43.300000
6 s7 s! o7 P( N' l/ }2 _; b+ L4 f 1.20 -43.30000000
9 Q+ G3 `/ J8 X- m1 E" s! K 从上述结果可以看出宽度和精度控制的效果。
; B3 J0 A; B. ~ 3. 转换字符
* E# U {" _0 b' I' T 转换字符用于指定输出的符号,可以选择的内容如表13-5所示。
0 D4 \, l6 J: ^7 N0 W+ ]表13-5 格式化输出的标志符及意义. |& B# ]5 Z) S$ C8 {
标 志 符
1 ?! U ~9 r+ J$ n0 `) u意 义4 W V+ C' S3 m: s e; X- _
%c
' x0 i* w& e3 l" b1 }, k/ C7 r输出单个字符( ` [+ [* ~' }% j
%d7 {3 ]- B3 {6 a6 y
输出有符号十进制数
/ x# j# U- p, w, s1 V %e- d* B$ x9 g% `3 y6 O% Y
采用指数格式输出,采用小写字母 e,如:3.1415e+00- w1 r; K0 j y
(续表)
6 D2 I$ ?" f4 ?标 志 符
% i9 d$ ^3 F. a8 w4 u- P意 义8 f% g/ J1 p) q7 c* ~- m/ k, h
%E G3 w! K0 b$ A$ S0 _, N% L
采用指数格式输出,采用大写字母 E,如:3.1415E+00
( _2 m* v# W2 [7 ` %f
! A# v% D( E8 r4 w3 n1 D以定点数的格式输出
# u2 g* m1 B! _) b %g
- ?9 C3 T8 G/ V' y% a2 |( E$ e$ c%e及%f的更紧凑的格式,不显示数字中无效的 0) R* I0 m3 I9 T2 I, d
%G- W V' I! a) Y G3 D5 R; y
与%g相同,但是使用大写字母E
' U7 o9 u- o G- \6 ^ %i( N" b+ j" A1 _6 h+ W9 |
有符号十进制数
7 L9 e: C( O, f %o
8 R; n7 M, v& G! q) L* ?; x无符号八进制数
6 u" _1 }- v% a: Y0 | %s, p- b( }% b* e" x
输出字符串
2 e: A7 H U+ ?" Q# u4 k %u* O* Y3 v1 t& |, ?3 \$ y
无符号十进制数
$ V/ U0 o# U, ~( l2 d9 q; W+ [$ U0 e %x% p) X% ] M% b8 \, V v
十六进制数(使用小写字母a-f)! d9 Y! l# q7 I
%X
- ^$ ~+ l0 i! A! r1 Y$ b& l十六进制数(使用大写字母A-F)2 n- b2 n6 _! _. N
- A1 i6 L$ k% Q' o/ M+ @
其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。3 [ |2 r3 h& v6 P" [
例13-7 fprintf 格式化输出示例。
$ _# O9 n& J. j. Y2 A; ~' x- I. f >> x = 0:.1:1;
0 o* p8 o0 e/ |7 P >> y = [x; exp(x)];
5 C* Y- T2 ?, M( |; c& e4 @. x >> fid = fopen('exp.txt', 'wt');
& A9 p7 _: P6 l, T& X/ p4 b >> fprintf(fid, '%6.2f %12.8f\n', y);9 X1 ^- u& f ?5 L6 v, D) v
>> fclose(fid)
6 C$ G3 M b; z0 q' o3 C# ] ans =
% v( f; M; P7 A- S6 O& @5 ^: E 0 M d) u3 v" {- H( V
显示该文件:
" g- e+ r6 U# K' w7 h: Y0 P: Z >> type exp.txt
7 W( z/ l6 k7 a1 z8 a 0.00 1.00000000
. n3 V# E# T2 A Q3 O4 C' F: C 0.10 1.105170923 k) _$ S* L- x
…
9 ]" N8 m) q1 }, S- R! V 0.90 2.45960311$ Y1 ^8 c7 L. L! F
1.00 2.71828183
6 p8 J: g% L) e1 W! a0 I7 W 例13-9 利用 fprintf 函数在显示器上输出字符串
* M" ~: }/ F: j4 d' u >> fprintf(1,'It''s Friday.\n')% P! a4 v5 H( D3 U$ [2 B& S( D9 |3 N
It's Friday.( ^: V% e% ?# L3 u# t
在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。0 d' _) C0 z0 i9 q! ]
' u7 a1 q% ]" B: _; T" B % |- P4 D& J, p
表13-6 MATLAB中的常用转义符2 O4 e" t% G6 T1 F
转 义 符
2 f, S5 _1 c1 P2 Q% H& n功 能3 B5 u% l9 V7 o" g
\b 退格
5 u0 |4 h( ]6 l8 I* R$ Y$ g. N \f 表格填充
~3 J) [) m5 J9 c \n 换行符
, p- O* m- o+ y, v2 d6 ~* A, \ \r 回车
& I' ^- x2 B/ S+ W$ A$ d8 U, | \t tab
5 H) C4 \' \- u0 |0 B! k) _ \\ 反斜线
2 S; ]% I/ h, _" k; i% V1 | \'' 或 '' 单引号
- X/ O+ P \7 e' j+ z %% 百分号
6 f, z) y" c8 k13.4 利用界面工具导入数据
H1 V$ @" O, O4 j7 C" _0 ~ 除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。
- T+ a& h% ?5 d- c0 V 选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。* I7 i {/ U! |, m
! L: K! E5 |/ Z
|
|