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