- 在线时间
- 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 的帖子
0 w6 K9 C y" d6 j0 M" ^7 T" |. Z+ I3 J& M5 M
, @% e( d9 M7 H/ a 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。! d) r& Z# \) j8 @& c/ {+ `
& m: g( ~" ?1 f/ Y8 d, V9 ~7 D13.1 数据基本操作
, R4 n+ Q: O) W' X( b0 q8 b" b 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。0 M, K5 v" M1 z Z3 {3 z: X5 T4 \
13.1.1 文件的存储
) M( L8 H) t+ ^" i+ { MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。4 R3 U/ F# @( N, s$ i5 M# Z
1. 保存整个工作区
* C7 X; }* a, m1 y# r 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。: _$ y3 q# v, P( d. R
2. 保存工作区中的变量
$ R& E( K$ H# E: e0 r; \ 在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
+ b. n7 ]3 @! C) t# u8 y/ I* V 3. 利用save命令保存. W' S# C) ^3 |! P9 M/ W
该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:! A' A1 {0 d6 y! G* r
● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。) P/ p5 P5 J# K ]) S# v; x$ G( t
● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。" ]. `7 a0 S8 a1 m
● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。
- F& O9 N7 S+ \5 h# x2 v● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
+ H: _. `) C; b! y- B# F* m● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
" h. q# B# Z9 C- k5 r● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。7 s9 E0 ^ {8 i" s4 w |$ y
● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。& n& Q; t4 j" \
13.1.2 数据导入" [; X0 M2 t* D1 T; x5 W
MATLAB中导入数据通常由函数load实现,该函数的用法如下:
9 S ~( I( q) I● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。
, P3 s2 q' K) h8 ^; N● load filename:将filename中的全部变量导入到工作区中。
2 }& F$ s. w, Y1 K! z. k● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。: }* j" v$ u8 n2 }0 K7 V( A
● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。. _8 U7 s# e" w: f, T
● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
/ k& [' v- h# y● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。
6 J3 f3 b8 h# J% f! k例13-1 将文件matlab.map中的变量导入到工作区中。
% q0 L: \1 Z5 q" v0 ~8 ] 首先应用命令whos –file查看该文件中的内容:* @, h# _! D7 {8 J3 D) {
>> whos -file matlab.mat# m* P& e0 R4 r+ X4 B# V, b! Q
Name Size Bytes Class- x0 f# ]* |7 W9 _3 X1 U
A 2x3 48 double array
) V8 z& z/ t7 W$ n8 w I_q 415x552x3 687240 uint8 array$ p4 |# M$ M$ w6 S: C7 R( E
ans 1x3 24 double array" e Y$ F8 Z1 \) J/ q3 ^$ r7 a
num_of_cluster 1x1 8 double array' h4 C2 R. @' E& B( i
Grand total is 687250 elements using 687320 bytes6 i% B) d, @+ Q ?8 W
将该文件中的变量导入到工作区中:
* Q# ?. c% M2 a# b. W$ I >> load matlab.mat5 O3 }/ v9 `: n2 ?3 Q* l# D3 i: x) N
该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。/ r' @, T. d, J5 V
' L% f7 R$ o2 K. W0 a. \ {5 |图13-1 导入变量后的工作区视图: q9 R; s* K. ^" p8 F8 }$ l
接下来用户可以访问这些变量。$ J: y5 K$ \! h: c$ t
>> num_of_cluster" [8 Q6 b4 q/ S; O# b8 V
num_of_cluster =
$ `. o$ A( W: k2 P/ x9 H; N; P1 c 3
: g1 z% I' T( ?* t$ G MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:
! V* Y6 Y }: x● importdata('filename'),将filename中的数据导入到工作区中;
1 y6 e1 o0 U1 D, L5 B# m5 p( |● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;' l- k8 }$ Y; ~2 v! e' D2 b- L6 r) `
● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;
4 W. E, v5 u6 f0 t$ J例13-2 从文件中导入数据。& g: B: ?7 P' k, v0 [
>> imported_data = importdata('matlab.mat')
* I# D: N0 n8 m$ D- V. Q; K: R2 X* R" Y imported_data =
2 e& Q j4 y p) q$ h ans: [1.1813 1.0928 1.6534]
6 Q% s8 H5 i4 V0 \2 Q A: [2x3 double]
. c, @: d3 N k3 v/ z I_q: [415x552x3 uint8]6 H. Q8 P6 r) S5 l
num_of_cluster: 3
. ~# l6 l H) Z2 r& l6 E 与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。8 M; x# J* r, `$ U! k7 B" Z7 a; z0 \
13.1.3 文件的打开& y' x9 Y# Q9 w- c
MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。
) n$ n6 A6 }+ Y6 d1 } ]% X0 E. E7 C5 } 需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。
/ j# F9 i/ _' l: J
/ [3 C* }+ C) F b例13-3 open与load的比较。% s* D6 ~) \4 x0 w# e
>> clear; M% M, R7 n' H% c: B& H$ ~" G
>> A = magic(3);+ M6 p: a9 ?# x; f3 Q$ @1 j
>> B = rand(3);
! j( f ^; i5 w, t d, T, P >> save/ c9 H$ g* m, k; X8 _4 l/ S
Saving to: matlab.mat0 v1 Y+ ?2 _3 g( r! D# J0 b
>> clear
7 p+ w0 [2 l3 C+ I; {3 d >> load('matlab.mat')! N- N% V+ L' m
>> A, b+ o( M& }( J
A =
& j& F; |. u: q1 P: t 8 1 6; E6 t, G+ J& Q; i
3 5 7
+ a2 J$ h% I1 G3 G! D3 V+ e 4 9 2
& k% \4 W3 t) e >> B
( y* J! g' D+ x' y$ T B =
- x+ o6 `8 }& Y( _4 C: ?7 o) y 0.9501 0.4860 0.4565
4 `8 Q/ o: s6 {# M Y 0.2311 0.8913 0.01851 j* P1 s8 z! {6 \
0.6068 0.7621 0.8214
9 _# S0 J ]. [5 K0 F >> clear' Y* \% _4 s& Z3 B6 G5 E
>> open('matlab.mat')& b$ w0 @# ?1 [+ v2 k% T
ans =
7 k: K' ~- S9 t4 o7 k4 q) ?/ q7 Y+ S A: [3x3 double]
2 S$ U- c/ f3 }/ P3 K- R$ w5 m B: [3x3 double]$ g. Z# H5 F' E+ T
>> struc1=ans;) o9 B- L1 F+ ~; E# x- Y
>> struc1.A
9 z- Z: ?! ?( I7 n ans =4 {) x1 _: x9 z
8 1 6
9 D0 Y; Z; w N7 c 3 5 7( ~8 ~" C4 U" ~; X
4 9 2$ N( j; ]5 h2 b+ S' S, S2 e5 R
>> struc1.B
8 L9 d. k8 [# _; [% b8 Z: I ans =" P' G# R! ~; D7 p1 J# G
0.9501 0.4860 0.4565
% z/ c4 u3 _! R% g* _& ? 0.2311 0.8913 0.0185
3 O7 L7 ^) n5 } 0.6068 0.7621 0.8214
! u5 w' r5 z5 g m13.2 文本文件的读写
* S& C/ S. M; D' j8 p0 o 在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
6 F% a3 l/ L2 |3 \ MATLAB中实现文本文件读写的函数如表13-1所示。7 H* |) w( H% ]2 ^+ ?; \
表13-1 MATLAB中文本文件读写函数
+ T: B6 X, n# Y+ L/ ~$ G函 数6 X* d( B# q- p: X) m+ g
功 能
, u7 m+ q5 p7 x7 P, Wcsvread
& o, ~, K$ h7 J5 f0 G8 H读入以逗号分隔的数据
- R% g" f" Q) c/ k4 mcsvwrite
1 a! z# Z$ }8 t4 h: y将数据写入文件,数据间以逗号分隔
# y+ T& H/ K9 a/ a9 ^dlmread
9 ]0 x5 o$ h" C" P将以 ASCII 码分隔的数值数据读入到矩阵中; C H, P! y& U- r( |
dlmwrite1 C. a; o r; j" K) [
将矩阵数据写入到文件中,以 ASCII 分隔: ?: H: ~5 j$ a, d! u7 Q
textread
+ _9 d+ G5 L, v1 \从文本文件中读入数据,将结果分别保存
2 e0 g& Q0 f5 C' K# t9 l/ k& Otextscan' t( B) S0 i$ F5 Z3 ~0 H" B; f8 r
从文本文件中读入数据,将结果保存为单元数组
6 d4 n5 _& n _3 |! _: R 0 c; s7 U0 |5 L
下面详细介绍这些函数。- k2 J2 N, N9 r; u+ W' e) G
1. csvread、csvwrite
( ]% h) t& L W+ D# e. O/ H csvread函数的调用格式如下:. M% Y7 ^5 V2 N. s+ l N& c1 D
● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。
5 C4 m, |3 k. D) E● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。. P1 }4 i$ {3 M0 I: \8 i
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。
0 q) X7 J: b# z% f r csvwrite 函数的调用格式如下:( R- |9 g$ \7 q' P) O
● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。
2 ^. S7 i/ e d; k● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。6 v0 Z" r; J5 }6 J( }
● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。8 t" B3 U$ u8 P* i: Y. s
这两个函数的应用见下面的例子。
* @2 ^. A/ I0 Y例13-4 函数csvread和csvwrite 的应用。0 H8 l5 F7 _( W/ j0 I5 R9 c
本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。* P' d% ~1 \2 G2 J8 Y+ ]
编写M文件,命名为immatlab.m,内容为:
9 Q4 o1 i4 m5 l) B7 k2 \ % the example of functions csvread and csvwrite
7 z) u" V5 V* j% A( |* E1 }8 M4 _8 K5 ^ I_MATLAB= imread('D:\matlab.bmp'); % read in the image, @. O- V+ E8 q. l/ Q% K% B
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image
& ?' Q# u: @# ?9 B$ S figure,imshow(I_matlab,'InitialMagnification',100); % show the image
% G7 }5 t8 t% W& w( o7 W4 s- Q csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file& \ x! P( j7 Z* Q7 \9 y2 r
sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
( P) S/ p! G: f- w. D1 q* J; _. F7 U sub_MATLAB= uint8(sub_matlab); % convert the data to uint85 o6 F) w' Y8 r
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image# [/ [- n% n* q7 R3 }
在命令窗口中运行该脚本,输出图形如图13-2所示。# h |" A2 d8 n* j+ y% }4 K
1 m k2 O+ G, h' A6 C(a) (b)4 V* C% s8 [8 F8 x
图13-2 例13-3 的运行结果
8 r5 g5 ]3 u6 d- E( I1 h* r' X3 V 该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。
& z3 w% [+ w+ ?9 \8 V% k# h4 Z 2. dlmread、dlmwrite(个人觉得这个比较好用): V8 n, b* x& `5 c
dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:& k/ E& b* C0 z$ Y
● M = dlmread('filename')
- j3 s8 c0 u8 Z) u● M = dlmread('filename', delimiter)' V+ R+ E. t: \% [% b) o
● M = dlmread('filename', delimiter, R, C)
( h1 Q4 d; g7 n$ p7 O● M = dlmread('filename', delimiter, range)
5 V7 {( F; j5 S. X# I 其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。. D7 r, M2 X9 X3 ?8 L
dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:
8 N9 n, ~, {! ?' l& h" C/ H● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。
9 M' w1 g0 e* ]5 Z7 s; d( O● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。' D" t9 v1 N/ f9 y
● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。
1 ?) H H& C8 o* H& }● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。
( R, |' x4 |! p* f8 }( U+ j9 q● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。
' v+ i% T# D5 y1 F* v. m● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。& D( f: C8 E# f" z7 {+ J+ |% l
● dlmwrite 函数的可用参数如表13-2所示。
2 L F8 i+ `" M' _* l3 W* a) P' J6 R0 S* ]$ ^$ o$ f
4 R/ H; b4 F& }表13-2 dlmwrite函数的可用参数
) T) ]7 f; h/ s2 k参 数 名+ g3 w e# b7 e; Q" y- H
功 能% s& } o: `9 Y$ D5 l$ B, v3 t5 j
delimiter4 k. \8 t7 R% k& X9 c% \+ b$ _3 Y
用于指定分隔符8 a6 U- O# S2 t* Z3 n
newline4 d( ~# B- ]% W5 r4 E' p+ D
用于指定换行符,可以选择“pc”或者“unix”
- S2 F- l+ c7 y/ J' w {% Hroffset
% S0 M" G, K2 F$ G( i7 k3 u2 W9 z行偏差,指定文件第一行的位置,roffset 的基数为 0
1 z* k" }2 Z, g, ~' n* h3 ycoffset
, \& d4 M2 a+ X# `- P3 D* G& a列偏差,指定文件第一列的位置,coffset 的基数为 0# B# h& M! i- U, A4 O0 a
precision+ X" w8 f- |3 V1 g# e3 x$ R9 Q5 r8 ` N
指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”
- `9 h/ H* Z$ T4 @; [' V1 @
! `; j$ v, b k0 D7 K 3. textread,textscan; L# x l. E" Z- `
当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。
1 ]' |8 C2 E% M9 e. f 例13-5 通过%读入文件,按照原有格式读取。
1 f/ ?1 n) [2 e d) o文件的内容为:: b% T; ?4 A: f" I2 s
Sally Level1 12.34 45 Yes; v+ T! p; T0 l: b2 F" U
在命令窗口中输入:
, I# o- y- j6 _0 V% T) W. y >> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)
/ i$ O( ~9 L$ X) R% M x得到结果为:6 _4 N0 ?. u3 n, V0 Y
names =
, W1 ]8 f! k/ ? 'Sally', Y" j. g) z( ^
types = ! `4 V9 n3 e# [0 @' @/ f) O1 Z
'Level1'/ f) b) w7 u% B+ a
x =
+ `) g% K. C$ Y0 _5 Y 12.3400' H' f; T6 T; b! R4 _
y =1 j8 I8 \; w3 D
45
6 D: y6 n u. I% P) C3 Q answer =
2 ^; ?1 T: K/ O& L8 x 'Yes'* m' s! q1 o1 |) \) W1 y" [
* H& [" h' W* A
7 u( c( ~& w% e, k% y- g( q( @
例13-6 函数csvread和csvwrite的应用5 E" m7 c# x/ Z$ ]
Sally Level1 12.34 45 1.23e10 inf NaN Yes9 S# t1 N" w$ f1 z: C2 T( O
Joe Level2 23.54 60 9e19 -inf 0.001 No% V4 s( q% O- g ?% V9 y' q2 @
Bill Level3 34.90 12 2e5 10 100 No$ }# `* |! _$ h7 P- x' c
>> fid = fopen('D:\mat.txt');: E3 G; Z0 T" H. a" `
>> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');$ N$ c9 w% |1 y7 h8 G: ^
>> fclose(fid);
# U6 D3 }* Q- F1 @3 _) b& X" h13.3 低级文件I/O8 g+ w1 X4 N T- w8 J" B5 L+ M
本节介绍一些基本的文件操作,这些操作如表13-3所示。
/ p- _. f( H8 P7 V表13-3 MATLAB的基本文件操作1 z7 \9 K9 p; L! y9 i ~
函 数* o- D. S( a. ]7 e1 a
功 能
8 ?- K% f2 V; B* z6 i8 w fclose
1 b* o4 i5 O) U& Y关闭打开的文件
" f- {" R' x1 ?# d2 G feof+ B9 H4 x; z! s5 W
判断是否为文件结尾 M& }4 H+ @- F G
ferror# g9 L& B" [6 X0 W2 C- z, l( `. u
文件输入输出中的错误查找1 M9 C1 J" |7 x0 I7 E
fgetl
/ h' @9 V0 [' E+ q: S读入一行,忽略换行符
( ?2 }6 T3 _* o fgets
, t% [4 j: E9 t( p- ^读入一行,直到换行符
( z/ a9 \1 x8 q7 @0 c/ Y, G, C, c# s fopen
. C- `7 m) [' S: z$ o: p$ W打开文件,或者获取打开文件的信息) ~' t8 w: A6 e, p: v
fprintf) d7 M1 a* N2 x) Q5 Z" F) l$ j
格式化输入数据到文件+ P$ Q# S+ \) j+ t1 h8 n1 i( [
fread$ d! q" j8 o0 L
从文件中读取二进制数据0 D) B# m# m5 o5 |7 t
frewind
0 b. X: c5 J3 F* f, B1 k; ^将文件的位置指针移至文件开头位置
1 {$ q! _8 ~2 g& L( | fscanf
# K5 m9 O- S8 [' J8 ^格式化读入, N/ F1 J% N" g5 f) o- P' W
fseek9 l9 t' p! q9 T# T7 g+ S
设置文件位置指针
8 |1 e$ u. [3 S- }- H, S8 A, } N) e7 l ftell
3 N; W: k! N c文件位置指针
4 g+ s0 ?4 |! a+ J- ~0 g' g fwrite0 K- O" `1 Z8 `6 b! q, j6 H: V
向文件中写入数据3 ~$ I! [4 i O4 ~: l- U
a% L: f, J- i6 `; {" g0 @# [* I7 J
下面重点介绍函数fprintf。该函数的调用格式如下:$ v4 \$ h* p+ |7 P
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。1 K/ N8 U- s. T# v# t
上面语句中,参数format由%开头,共可由4个部分组成,分别如下:
$ c; w6 f0 E x& l● 标记(flag),为可选部分。$ _' f9 ?+ `% K4 S; F
● 宽度和精度指示,为可选部分。
( G- M8 h% U' M● 类型标志符,为可选部分。. u4 E+ x9 D, ?9 s- Z1 f
● 转换字符,为必需部分。
8 o9 R$ v) ~7 O& s 1. 标记/ p. U8 @+ ?4 i* `
标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。! w4 f1 L, G2 [2 i
表13-4 标记的可选内容
; y: M+ E! J& z7 @& M& v函 数
8 |/ {) B, k! t功 能
& V6 A! s! ] E示 例
9 p* m3 d# A; I5 i. T0 r0 b; ]5 | 负号(-)
" D4 W0 J4 s! D! U 在参数左侧进行判别
: E" T1 D% R7 x% [! [7 G %-5.2d- r/ m; R: P. ]9 w7 B" j# j
加号(+)7 ?# S+ i: g8 o0 }
在数字前添加符号3 r6 J$ B7 m0 _ n
%+5.2d) [8 I; V' X3 P8 N8 l
空格7 u; O/ M' _0 V- ~
在数字前插入空格4 B, ~- p, p+ Q' u0 h
% 5.2d h+ ?' e7 q! G# ~& h1 X# f( T
00 X8 }) O) K" C! L9 K0 V6 M4 P
在数字前插入0
' [% E. c1 Z, u9 d8 z5 V- o7 W %05.2d/ T4 O9 n: ^; O% {3 z
2. 宽度和精度指示
2 O5 O3 P1 w3 u* c) w- D/ L V0 D T+ Q 用户可以通过数字指定输出数字的宽度及精度,格式如下:
" l1 J/ |! p" D, G8 ^● %6f,指定数字的宽度;
m! g) A0 M6 T% J& J● %6.2f,指定数字的宽度及精度;6 W y ?8 u( ~) R1 F
● %.2f,指定数字的精度。, W. @# W4 l5 ^
例13-6 fprintf函数宽度和精度指示符示例。
6 `( O- z0 ]0 w; x; ` 在命令窗口中输入如下命令:9 G+ O0 L x& p5 c* h
>> file_type = fopen('D:\type.txt','w');
( q3 r0 a# Z* @$ P/ a >> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);$ X- R5 u; p5 s# R
>> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);2 K% e- L& P0 `5 n
>> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);
1 e2 v- Z5 S% f% P- E >> fclose(file_h)
- @% T1 K |* w+ ~" \' E ans =
# f' F' `6 K6 @3 L 00 |, a" r/ U. u K7 Y, F
打开该文件,其内容为:* L; D% b8 D$ w9 ]& R7 F
1.20 -43.30000000
. y! @" }4 f8 j6 f6 F) U d 1.200000 -43.300000
& a0 p) @ y' a3 s! R 1.20 -43.30000000
7 d, ]# p& d2 T! v+ Z. R' I 从上述结果可以看出宽度和精度控制的效果。1 u* y) e9 c9 X
3. 转换字符- T$ w. P( f( s0 g
转换字符用于指定输出的符号,可以选择的内容如表13-5所示。9 q! q4 S Y4 K; z2 _& A
表13-5 格式化输出的标志符及意义
' S7 M y. g F5 P标 志 符
2 d* f0 X& I0 Y2 g- d/ ^0 c意 义) [& p! b" f! Y# ] L/ w" \! F3 N! K
%c- @1 U `. X, v& }' X1 h* N
输出单个字符9 B+ c3 R+ e7 F% u# K
%d
; H6 C3 F# ~% A2 x1 l4 ]$ c; R' E输出有符号十进制数
# ~, q3 m4 T: b9 F% f, {8 [ %e- p" Y) b' x/ u- r
采用指数格式输出,采用小写字母 e,如:3.1415e+00
# f Z! M6 \' ?(续表)
8 l3 z3 x% n2 Q$ Q标 志 符3 m( S: ~* ?1 ]" @% Q
意 义4 n7 j S6 X/ L0 f" o; }8 j
%E
" s r( E/ p% [& j采用指数格式输出,采用大写字母 E,如:3.1415E+00# R4 k; ~- m( k% Q
%f
- ^) L2 ]8 G7 F0 c# g5 N0 @0 {2 G以定点数的格式输出1 |. b! G' x) o) X) ]
%g+ `1 u% G8 G4 i. o) u. L! {: S2 A
%e及%f的更紧凑的格式,不显示数字中无效的 09 @& q6 F6 v4 a8 N
%G
4 {% m; R4 T6 n+ D" n与%g相同,但是使用大写字母E t/ J; |. B+ d' V3 p0 I& O- u3 ]
%i
) Y. a6 j: _: [, X: [有符号十进制数
5 `) G2 |) {* s7 t3 e %o0 N2 s5 i8 n- ]' s N. J' D( q1 N
无符号八进制数
- b; K4 M$ s- C* [- D- v6 a- ~ %s
& {* v) ^* i- b: m$ W7 c输出字符串1 `# G9 X) M/ b/ u
%u
$ Z* n1 ^+ R1 n" b无符号十进制数 N" e+ a+ i" ]6 ?0 V% x$ H' o* R
%x' O) x3 ^6 @3 y# g& R) u1 v
十六进制数(使用小写字母a-f)9 Q1 O! q. x: F1 Q& G3 U- a
%X) R I' K. c5 E6 Z" s6 W9 R" Z
十六进制数(使用大写字母A-F)& S% ^- o! k" l. K# E+ x( N9 [" j, N
+ \) {) h; V8 a: W9 ?0 r( y
其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。
# R, k. M- ?- W$ |1 |( [例13-7 fprintf 格式化输出示例。
9 f$ i. L* f) K/ a >> x = 0:.1:1;
. A) E1 d, r! ~( v/ y >> y = [x; exp(x)];/ J9 o. x9 \7 b7 d
>> fid = fopen('exp.txt', 'wt');
" u+ }, t0 G; N+ h" E- @ >> fprintf(fid, '%6.2f %12.8f\n', y);
: F' L4 r( R; j >> fclose(fid)
& s" m2 S7 m% T3 w( I ans =
- q( J, F2 M7 g& _1 v/ ^& a 0
* I- P- ~$ T; x. J" f7 f 显示该文件:
* w; J r& d# w& @4 X >> type exp.txt
$ H' r! p6 P% h 0.00 1.00000000" {) l/ r3 U, B! F9 I
0.10 1.10517092
4 |+ c" ^3 Y+ ~" y/ Z …
, i- ?" L1 |# v$ h: S/ z# E 0.90 2.45960311* P8 m" e6 p7 |3 u$ R5 [3 m( Y2 V9 x6 L
1.00 2.71828183; n& O) d# X0 {9 s e+ F
例13-9 利用 fprintf 函数在显示器上输出字符串/ x9 b5 Y d+ a% \
>> fprintf(1,'It''s Friday.\n')) K0 F( ]% ?5 F/ {
It's Friday., k. T) }8 A+ d% `
在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。
% v7 h' M+ a! j, a0 R1 z $ U+ F A7 z: P7 p. {. d' D7 X9 R
& M5 ^' N* E% @% [" Z, C& w表13-6 MATLAB中的常用转义符
, d- E6 n$ P& P9 D2 K转 义 符
7 Z/ I7 M; K. o$ @2 B# u: l功 能
0 c* s2 ?5 w6 s* Z* l9 V \b 退格; j9 b; ]0 q& ^
\f 表格填充" D; E7 _& c* P0 ^* u9 n
\n 换行符- C% K/ d9 ^! h$ D
\r 回车; {9 ?$ n) S* m8 D" d: m1 f
\t tab; A; j% a& g, v6 n7 J- v$ t3 t/ f
\\ 反斜线$ P6 S! e( f2 ~/ i6 e2 G9 t6 e. K3 ]
\'' 或 '' 单引号! p+ T* S, P3 L. J
%% 百分号- H' e, Y0 C7 q& g: }
13.4 利用界面工具导入数据, v; w6 N) K& F$ H" j
除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。
* U) `+ z6 w3 X d8 J8 g) W 选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。
9 i5 ^# j/ X, M- k) j2 }8 [, o( Y0 k' N! b' t$ }% n9 W h( [
|
|