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