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