- 在线时间
- 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 的帖子
4 z% z) i% Z; ~3 }* d' c* K. M+ \6 H4 V
, u& W& q9 h+ ~( G 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。% b" S6 C4 U# O o. A# \
) M' _; L, |' I3 V( Z* g2 X13.1 数据基本操作
. N6 i7 Y9 A3 D$ C 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。
$ p; k' m9 c' \! h8 L2 m& Y D, S0 e13.1.1 文件的存储
* K+ d3 s6 @9 E1 E2 p+ [2 W8 b MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。/ D$ l4 S) K4 l9 C1 Q
1. 保存整个工作区
( H& ?2 {3 ~: K7 @% T( R' G 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
6 t6 z9 ?* T1 W" ^- y 2. 保存工作区中的变量) x3 b H* ~0 N" ~% b
在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
! \4 @, g: @4 N- b9 [ 3. 利用save命令保存
5 F& p( k/ G5 w 该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:
/ `6 A5 h4 y' Q( U8 ]* Q9 g% t" z7 ?( G● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。7 w2 l3 N0 z) g5 |: x S: ]
● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。
0 O9 e j9 q |( P● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。
; C! a# \" Z5 O7 S% }) y. Q● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
. p0 A! F2 z, e! o$ [● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
, C8 @9 l" g$ a# O● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。
l% p* h$ U3 b9 T# r2 O9 J# s● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。( d8 g- c3 |+ y
13.1.2 数据导入 q9 K9 D5 D3 Z; U+ G& ~9 f5 ^8 j
MATLAB中导入数据通常由函数load实现,该函数的用法如下:. ~. n" E% B* a
● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。 ~1 q4 R) y3 h, V# w2 x1 f! M
● load filename:将filename中的全部变量导入到工作区中。% k+ T& F: {9 G! u( F
● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。
) s& L! C/ o+ z7 j4 w- v! y7 |9 g● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
, @) L* t3 G9 y! y● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
5 o+ A) k! ~ _- d9 r● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。
" t& \; f* M7 ]8 Q& `7 W4 s例13-1 将文件matlab.map中的变量导入到工作区中。! E& R8 l" R' j9 K/ P6 ~
首先应用命令whos –file查看该文件中的内容: n/ b0 Q/ s+ I B
>> whos -file matlab.mat
- s+ C0 F/ H6 I' r5 ^ Name Size Bytes Class' n5 T v* t9 p w* }
A 2x3 48 double array q+ k/ J' N' V y" T3 h$ |& d! y
I_q 415x552x3 687240 uint8 array% d1 L7 W0 n4 Z+ ]! s b
ans 1x3 24 double array
7 F/ |# W; D) T. }6 T6 e num_of_cluster 1x1 8 double array
4 R% w4 K$ `7 w: p Grand total is 687250 elements using 687320 bytes
; _3 T3 F/ ]1 y0 D1 z 将该文件中的变量导入到工作区中:
, ?) w1 Y$ O+ w7 X9 i7 H2 ` >> load matlab.mat
1 B! Y/ m, S7 B- X6 g1 Z 该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。
/ q) p/ W+ K+ F4 j8 C' E
% m c/ M$ e8 h/ N图13-1 导入变量后的工作区视图
) ]. L% x$ S$ K L, O* q8 w8 ` 接下来用户可以访问这些变量。
* N' R3 I `/ z1 r0 I; p: h6 R >> num_of_cluster
) d8 ^/ i$ r+ U0 v. P0 @8 v num_of_cluster =8 B T3 B8 a* _8 J; L
3( M2 [- G0 ?$ Y/ C
MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:5 [! a+ L/ h7 Y7 X6 S! \7 p
● importdata('filename'),将filename中的数据导入到工作区中;
8 J: r9 U8 E" {8 b6 v- ]" y● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;2 n& Y: _4 n5 `8 p
● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符; B8 T, x0 O( t- f! T2 L# W
例13-2 从文件中导入数据。, [+ T- T! Y# [! x
>> imported_data = importdata('matlab.mat')
$ `- D" U. D" d% E+ t/ m! U imported_data =
2 J' @1 \, T! K9 ?$ e7 x: I7 o# g ans: [1.1813 1.0928 1.6534]. ]2 A& Z- F) b5 B! H
A: [2x3 double]
% B% v" X3 F1 o& y I_q: [415x552x3 uint8]
2 G" e, L0 ^ v# @1 A num_of_cluster: 32 j+ ]5 r8 z8 ~5 A
与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。5 D* ?$ T0 Z% R$ e* G, Y
13.1.3 文件的打开9 ~( I& _7 e, Z* o e) ?5 ^
MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。
5 {/ X5 K& P; V+ I: p+ d 需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。5 X7 h7 o+ X; _7 d$ A$ E, g) E8 e
3 j5 d: Y% S: D. ]) J8 i7 c
例13-3 open与load的比较。. z8 K1 _: _" J: T# B
>> clear9 a% N( W( v) A" e1 Y( Q1 ?0 y" [. P2 n
>> A = magic(3);6 B' N; R. \: `" U
>> B = rand(3);
1 p+ b: G# H" y6 I5 | >> save
5 i1 }; D& O9 p7 ]2 V* E! w Saving to: matlab.mat
7 {0 p3 p7 {$ x, M2 [$ ]' b$ T" x >> clear
. c, V; s6 \" z: b >> load('matlab.mat')
# j9 T( e" Q, U >> A
3 D" ^: Z8 o9 O3 f$ W/ I1 P A =
( X; n0 [: ? P$ @ 8 1 6
: v1 V+ O) ]( S B# c- g# F. @! w 3 5 7
8 D; k5 }4 L6 `3 p! x 4 9 2
) Y$ M7 w7 ?& r# v3 B >> B
$ j( k/ L1 O6 G7 }) I' W B =* e4 j( F; O6 V& U- h
0.9501 0.4860 0.4565
: S2 g5 H+ q" w2 \3 [3 x* D+ M2 X 0.2311 0.8913 0.0185
9 { p z) G' L& k/ y: X" g) b- N 0.6068 0.7621 0.8214* V/ J6 @- z: U' N& F( ^: `
>> clear9 P, y2 I( {+ i& {
>> open('matlab.mat')
, T6 x5 A& ~, j3 u- ?7 z ans = $ W9 L ]! V7 J8 r. C7 i
A: [3x3 double]
, e- ]% e& D, @& O# V B: [3x3 double]9 p# U& f- T# Y) O5 d, d
>> struc1=ans;
6 @6 b* H* k* Y! l' s' ` >> struc1.A; S; J0 U1 `& w1 A ^
ans =; b. i& I3 h9 R7 z: Z7 p1 v. b
8 1 6
2 h$ \! {( s4 l* ]/ { 3 5 7 h3 h$ u, h5 }- \ S; x/ T
4 9 24 h8 ^; e+ ?0 o9 O# k6 D2 I; x% H
>> struc1.B
* V e( _5 B0 |; Z0 u8 t ans =4 W; P0 f; X& q! ]$ w: Q
0.9501 0.4860 0.4565
5 ^3 s- g. q( W/ a/ K% W 0.2311 0.8913 0.0185
+ j! \+ Q( a) B! Z4 q 0.6068 0.7621 0.8214+ d8 }; c$ U' l0 ~- J
13.2 文本文件的读写9 D0 ~% G' n' x2 V c- B( o
在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
: j: e( L! \ F7 \ MATLAB中实现文本文件读写的函数如表13-1所示。
Y+ Y. o& W" e( p& q表13-1 MATLAB中文本文件读写函数. q% P" X4 N( h; V5 {
函 数
' ]- Y Z( E' f+ O功 能: H4 R& ]' F, D) [
csvread% w* k$ y) q+ Z, I7 D, f3 G
读入以逗号分隔的数据+ C( Z5 ^+ m) W g& P- @# U
csvwrite( B2 Y3 }3 `$ r5 G
将数据写入文件,数据间以逗号分隔1 W" f' H. q: I& y! \$ c5 }
dlmread' l6 J; \/ H. k. K! X/ N
将以 ASCII 码分隔的数值数据读入到矩阵中
! A" q" z1 p% B; w& X0 P$ k% e6 Gdlmwrite5 c: y, l# f6 N7 M; l* l9 o) C5 R
将矩阵数据写入到文件中,以 ASCII 分隔
" x) N5 y- ?' K; W' S1 {textread
4 b+ F2 y. a# l6 m( r9 ^2 r从文本文件中读入数据,将结果分别保存
2 m* y# e' z) Y9 L ctextscan
! \( W0 L! T" W* A9 N8 g从文本文件中读入数据,将结果保存为单元数组
% c4 Q5 y! j% u* K# Y8 b6 }
, d4 N' l0 t& C" q* f 下面详细介绍这些函数。
3 W$ V- D8 ^: ~9 [3 X: k" \ 1. csvread、csvwrite5 G. @/ v" h& t$ w. @& \1 {
csvread函数的调用格式如下: x0 S$ m& S6 S+ o
● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。
7 n" W, G" s6 A. B2 D● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。' e! c- o# l7 u$ d& L( Q. H$ f
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。7 G& ]8 j3 t e" A& J
csvwrite 函数的调用格式如下:
0 p4 C( c! q1 l* z7 a/ o● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。
9 o/ a/ B" P) m● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。6 `* o7 Y/ |- F5 g+ g# \
● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。; I# K, b( s; y4 ~( \8 G
这两个函数的应用见下面的例子。
# m3 x; N H: ]" w1 p2 N: K& F U) G3 I例13-4 函数csvread和csvwrite 的应用。
0 e; }5 h+ l% a6 o 本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。
" z& p9 w5 O# e* S$ Q0 C 编写M文件,命名为immatlab.m,内容为:$ b) \5 }) n6 R- X3 }
% the example of functions csvread and csvwrite
/ U7 ~: O( a) P1 r I_MATLAB= imread('D:\matlab.bmp'); % read in the image) |: z8 d7 t7 m4 U- H( \4 }) G
I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image
) x2 P/ w% D/ I- o figure,imshow(I_matlab,'InitialMagnification',100); % show the image
d5 o% y- O& ?! m9 f- M csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
: I/ w# M2 w- J3 P sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data
9 b% N. B3 S) t( [+ l& I6 V sub_MATLAB= uint8(sub_matlab); % convert the data to uint8! E9 h- }) y3 O$ O
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image. @3 b5 N" m9 V
在命令窗口中运行该脚本,输出图形如图13-2所示。8 n% x# h+ X8 C9 B2 l
# E5 q0 x$ h4 e" a(a) (b)
m f3 U v7 `* J# p2 J/ w! g) G图13-2 例13-3 的运行结果- k4 Q; X" b5 p$ l7 C9 X1 \; Y% N% c3 M
该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。! a! j B% I1 L$ b/ Q
2. dlmread、dlmwrite(个人觉得这个比较好用)9 Z7 k8 d, H3 L, O7 m" A$ Q
dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:9 K$ ?9 c9 i9 ~ ^8 q2 B
● M = dlmread('filename')
7 Z, Q2 P1 ?7 H) B1 z● M = dlmread('filename', delimiter)
6 `8 S! d, r" J● M = dlmread('filename', delimiter, R, C)* k/ Y1 Z& L* s, ^' \3 C2 M. ]1 Z
● M = dlmread('filename', delimiter, range)) @( X( Y# V, u5 G# u9 i
其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。( N6 ?8 o2 N( j
dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:2 Z0 g6 V! F {
● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。0 H" b! p/ G2 `3 k- I
● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。
. r4 o/ ^% q$ L& X( ?● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。7 Q, k# P! q2 F+ o4 L; l8 C9 a& f2 o3 H1 X
● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。
9 B* D; \/ U; o7 d● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。 [8 E& {. s* f" C+ l7 n7 p7 F
● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。, R: W4 m" p" {5 Y. ~1 a
● dlmwrite 函数的可用参数如表13-2所示。
3 q! f+ o- D) V& J* l
9 C7 o# A9 h$ q. \7 h- h6 ]# n9 X
, @9 N4 y5 Y/ \/ f0 J表13-2 dlmwrite函数的可用参数* m3 s, O/ l+ J
参 数 名0 C- U7 M4 I! ?0 s% D2 |
功 能" M1 g% _2 R" H& t9 e
delimiter" G# _3 L3 A8 c
用于指定分隔符7 i/ y4 ~3 m8 M& i& R; \) S& _
newline
R$ U1 H8 `' f. e! d0 `) \用于指定换行符,可以选择“pc”或者“unix”
. D" }$ o& e, v7 @' O6 Proffset
) m8 V3 S* [6 r# f行偏差,指定文件第一行的位置,roffset 的基数为 0: v3 s2 l3 K) h1 o1 L) ^
coffset/ F! q- E- x/ J0 a6 T
列偏差,指定文件第一列的位置,coffset 的基数为 0: S5 a7 S9 _% C6 g
precision9 F- P) M' g& s1 b6 J
指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”
4 A" R4 j& W0 t7 u- x# ]* z
$ e2 {% M8 }$ G6 C$ R+ m6 H# J 3. textread,textscan+ V' n5 ~) ?# q4 }$ z, R
当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。
2 q( V3 W) z1 g4 z6 V7 Z1 A' H3 F 例13-5 通过%读入文件,按照原有格式读取。
9 u# h. H" U: i! d( W文件的内容为:
9 @8 B/ I+ I) F$ W' [% C+ f3 J Sally Level1 12.34 45 Yes
; Z! I& N4 z$ [7 E: T! X0 B% |: V在命令窗口中输入:
4 \3 f* b0 d# q4 Y& e/ l; W( y1 Z >> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)
7 U9 k! l% K. L" D P. H得到结果为:
% L2 e* r1 S. Z# C0 D names = 3 f) u- P& ~. H( m5 G
'Sally'
6 A+ X; F+ V* Z$ w( q* X types = 6 C+ G6 J* k' w( t' u( U
'Level1'* M; Z& [4 F4 a" I
x =3 b0 @' \5 [1 z+ w
12.3400- ^" i9 l6 m3 R- K* p. p' o( Q8 Q9 D
y =
6 i; B9 c$ h0 }% c 45
5 c9 D6 j: a- |3 C9 N' J: P answer = ( _/ M8 S3 z v3 k9 s
'Yes'* L v0 e0 w6 W' C% ^& y
- L" a5 K, M4 ^& H1 e9 D* A 4 w D6 Y3 D8 @; `/ U4 L' [5 G
例13-6 函数csvread和csvwrite的应用
/ j, I$ @ {- j _" n- ~& n Sally Level1 12.34 45 1.23e10 inf NaN Yes
+ t/ |! s. @2 m8 ? Joe Level2 23.54 60 9e19 -inf 0.001 No
+ m" r9 f7 q' f, f' s( H, z Bill Level3 34.90 12 2e5 10 100 No
' B$ q' P8 H/ C2 y1 f) ]8 b >> fid = fopen('D:\mat.txt');
5 Y$ m% Q+ n; E4 k >> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');- t. _0 f. @5 F# d* N
>> fclose(fid);! S9 L; q h/ p
13.3 低级文件I/O- u$ J: K" e- _8 a q8 P
本节介绍一些基本的文件操作,这些操作如表13-3所示。8 g- L" i' D1 y2 l; B0 T& k
表13-3 MATLAB的基本文件操作
6 z, r1 n% s+ @" g) ]函 数1 n0 ?# j; u R2 A/ X
功 能; ~( R! ]" e* b7 _; z
fclose
2 d2 q1 g9 a+ ~3 z2 O5 H关闭打开的文件7 N. U( p) a0 _8 W- P
feof! ]7 }3 l# h4 ~* @4 d A
判断是否为文件结尾1 a# I2 M) z% f- p! t9 S" F1 F
ferror
9 R+ y6 J1 B# d5 d7 t文件输入输出中的错误查找5 ^' c. O/ r) t0 R& K
fgetl+ Y& v% N) l: y# {+ i# V/ H& p7 O
读入一行,忽略换行符1 F1 x- F4 K' Y% D6 q
fgets
6 T1 n; m0 d9 ?* I$ `2 d读入一行,直到换行符
7 M. ^" d( Y) o fopen1 |+ o3 ?2 N; D3 H% N8 h1 f
打开文件,或者获取打开文件的信息
7 I0 O; j! q% } fprintf8 c( W) h$ J& |& B7 o S \/ q5 F
格式化输入数据到文件* m2 R7 @! y x5 ~9 {4 X# N( P' X
fread: \3 d4 e! `9 I: U3 u' t( Y
从文件中读取二进制数据3 O. R) D" e. D/ P: ]+ ^3 ]/ F
frewind. c( S3 { j1 {
将文件的位置指针移至文件开头位置1 m. m7 N' O/ q# W4 I6 Y
fscanf4 ~( i& @8 I# C% L& E4 j9 i
格式化读入& N0 W/ }5 G4 ]. ^/ t
fseek$ c- o, M w9 y$ e. X
设置文件位置指针
1 b3 x& D8 l: p3 l" h" |" q3 a ftell
# U. o+ O- h5 c; ?8 N+ c, r/ c文件位置指针. K. M; e( `& J1 m% n9 |
fwrite
& B# z' N7 }! X1 A7 R A, T向文件中写入数据
3 k; F& D7 f4 a; J2 i0 _6 ~
k( t4 x; x+ N" B- | 下面重点介绍函数fprintf。该函数的调用格式如下:3 P" r9 |/ P6 d% ~- h0 j4 c
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。
$ g% \& _# ]# O7 U 上面语句中,参数format由%开头,共可由4个部分组成,分别如下:' [6 ]7 Y& C. ] r8 s
● 标记(flag),为可选部分。
+ f1 r8 W1 y' a% O8 Z● 宽度和精度指示,为可选部分。7 T% ^6 \5 e( e# B a
● 类型标志符,为可选部分。
% P$ F, i6 B- x3 c) y) y$ C● 转换字符,为必需部分。. Y5 m7 U$ D4 Y, Z% V
1. 标记
+ Y m6 m6 k7 [( f 标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。
8 p, ?( A' T! e2 v+ R* y; c表13-4 标记的可选内容& J, W" t$ I9 N9 W2 o) d; n
函 数% [& G# Y( d4 P" ?
功 能
5 j$ S9 W! B6 Q# O0 h, ^% D( P示 例
) g) P% S; ?/ r0 q2 B 负号(-)
' C) ^' u2 q9 p' p7 B 在参数左侧进行判别
4 D# X; T0 |* ~$ b: ~6 J3 N %-5.2d
0 t4 K, a8 j C6 W$ y& M2 F 加号(+)
. P$ S5 s) U! p; }- Z/ A2 I B 在数字前添加符号
5 L9 r2 E3 t8 {" G9 Z# X %+5.2d" v& s+ u0 s( {( K- ?! T$ h
空格* n: |. ]5 y+ w6 k
在数字前插入空格
( t1 R/ r. u* B % 5.2d |7 t6 B. H0 Q/ [3 Y* W* H" }# H) E
0
* _5 H+ R" ]) b8 b 在数字前插入01 h" u/ ?# g" S, Z" B) P! n
%05.2d
0 S$ r: A, U$ F/ e) |0 ~ j1 ` 2. 宽度和精度指示/ V0 T& g* s. p; g* i _2 E
用户可以通过数字指定输出数字的宽度及精度,格式如下:- J3 z" n' U3 r7 _
● %6f,指定数字的宽度;+ Z2 S/ l, H9 J/ k5 a$ Q# y
● %6.2f,指定数字的宽度及精度;; H6 r( d3 _8 k' p8 C
● %.2f,指定数字的精度。6 V' @: w. ?6 C0 g
例13-6 fprintf函数宽度和精度指示符示例。 [/ V, Y8 q3 V6 |; B3 u
在命令窗口中输入如下命令:
( D6 L( C/ ~: K( \2 {% C >> file_type = fopen('D:\type.txt','w');: N! y6 z4 L6 g6 B- i$ e2 r8 o
>> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);3 M) e* |* S( Z& b, W) H
>> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);
! p# J, R, Z2 C" B1 } >> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);
" D+ W- t0 w3 E0 O& D >> fclose(file_h)
6 p5 K5 i. M I8 j& s ans =
" N" X/ r0 W. [4 x$ n) L" O 0
7 G. j) ^6 e+ {$ Z5 D 打开该文件,其内容为:# Z) v4 q g1 s: L. O+ A' J
1.20 -43.30000000! g( N' H4 v# d1 Q8 p) \
1.200000 -43.300000
7 D5 k5 `8 K6 Q# G1 U4 _ 1.20 -43.30000000
4 X( V1 W6 j! d 从上述结果可以看出宽度和精度控制的效果。
" r; f( D# \. q6 a$ B! \5 [: ` 3. 转换字符 k% _ G9 P/ L6 V( P' F% ]
转换字符用于指定输出的符号,可以选择的内容如表13-5所示。
# V1 H- H4 l7 _- k7 d c表13-5 格式化输出的标志符及意义1 l5 O4 O; W- Z) v4 b9 f
标 志 符
& a) y8 U3 |, O! I, A意 义/ M. e$ Z# W3 k$ Y9 o& S( s
%c0 u8 o" ^0 c( e+ n: ^; G4 Q2 y& Q
输出单个字符$ b1 P1 @9 W6 H: N& }: c
%d
0 {; @0 S* p) B1 M输出有符号十进制数8 Y/ |, D! x. f, u% s$ A
%e2 Q+ a+ c$ w; y# Y
采用指数格式输出,采用小写字母 e,如:3.1415e+00
2 W( n' e. F0 `# G1 X) C(续表) . U' I8 F: a2 m! T3 h
标 志 符
6 v" P! b2 q4 W# Z' c意 义
3 J: P( A- L: x! w8 e2 F %E9 L# E+ p" [& a: g$ r
采用指数格式输出,采用大写字母 E,如:3.1415E+00% O% Z: M9 ]! P) ]% W, ^+ a
%f
3 R) `- f+ ^* x' J以定点数的格式输出' A7 H6 N X* z1 b+ `3 ^8 N" v$ G
%g2 j& B* q+ I6 ^5 Z
%e及%f的更紧凑的格式,不显示数字中无效的 0, B$ D0 D4 t; Z/ [
%G/ d6 u: ~- D0 Q( K C
与%g相同,但是使用大写字母E
2 e4 ?2 g: o% X0 C/ I5 [2 E7 k) F* ] %i+ s2 |5 i% C/ A# ?7 _& x
有符号十进制数
' Q e( s0 U9 E o %o. N1 {" `4 C: ^# r, M
无符号八进制数
5 R( P. p- f% m# g$ i# r# P$ ^ %s
$ j! F, n- }9 W' |& |& [输出字符串
9 l6 L5 t$ E( Q% p1 [7 v0 U9 e %u0 v' u0 n0 Q) V: W8 \
无符号十进制数2 u) e8 s( v1 Z. @+ ^
%x
' h, Q+ n8 K; \. {8 h& X; W" F十六进制数(使用小写字母a-f)
/ g+ N+ B4 r Q: V %X
2 `- J1 L0 g0 {- F十六进制数(使用大写字母A-F)- ^) S% q( o# |) }
6 Q1 } b" t, \
其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。- G; y6 M5 L2 t" h7 s0 D6 J
例13-7 fprintf 格式化输出示例。& F8 d& t0 a c6 k$ l! i
>> x = 0:.1:1;# g" w6 u+ Z% b; K
>> y = [x; exp(x)];
2 Z) u! F' w2 s9 m1 ^ >> fid = fopen('exp.txt', 'wt');
3 k K4 d# C" \0 r! A7 l; A >> fprintf(fid, '%6.2f %12.8f\n', y);
( y: j3 a6 \8 R- L+ w" d. Z >> fclose(fid). M$ l, |- b3 [* ?- P1 [; }
ans =
. _" Y7 _- a, N0 m6 T- ` 0
# ?. h6 ~ M& ^2 Z 显示该文件:
, S4 i; O: v2 ~4 c >> type exp.txt
* d. x$ j7 M1 H4 F3 } 0.00 1.00000000
* x/ _5 C* Q& b2 V 0.10 1.10517092
% m) |) t5 c5 I4 D X" |4 d- m …) j% j, M) p) o/ [( c& H- w2 m, u
0.90 2.45960311
0 x, i. m; Z9 k* m+ p7 |$ j 1.00 2.71828183. p& u; i* d! S Q0 p( b" g
例13-9 利用 fprintf 函数在显示器上输出字符串 k' F& l1 x: Z2 W( ?# z
>> fprintf(1,'It''s Friday.\n')
: Y5 e( }* P- F9 c( e It's Friday.
5 s; T7 y/ F8 }) O/ ` 在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。9 d; K6 Q0 j p
; K, u: m5 F* X [, l
1 T' u- C0 R9 ~7 C
表13-6 MATLAB中的常用转义符
8 Z9 O3 Z) ~/ G, W转 义 符1 X# N3 B {8 B% k
功 能
. }' i8 p7 D3 A( Q& e5 M U' p0 \/ @ \b 退格
+ B7 H) c0 {; N) n `; Y \f 表格填充6 d2 J3 y% m3 X
\n 换行符
, [" m: S+ N* Y \r 回车9 R. C, v" s, l' n% X1 v8 N P
\t tab/ C8 O' T* {9 z+ G. m9 ^
\\ 反斜线
" j3 M$ Y- m0 }! W% J: P4 { \'' 或 '' 单引号; N" q0 ^4 r! w8 h3 i
%% 百分号
5 i u r" W; V4 G7 _13.4 利用界面工具导入数据5 f5 O* v' U2 K7 T6 ]
除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。, M* F( w( u5 @! O ]
选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。* Q' i2 {$ I( N& m
9 ~: k! u2 \! i& W& U% k
|
|