- 在线时间
- 5024 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2009-4-8
- 听众数
- 738
- 收听数
- 1
- 能力
- 23 分
- 体力
- 77550 点
- 威望
- 96 点
- 阅读权限
- 255
- 积分
- 27191
- 相册
- 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 的帖子6 x0 b. R, o1 s# f4 K
% h5 ~5 D( \ Q5 Q# i. H# A
- j R) n3 c7 L( [9 z2 V K 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的导入导出。
2 I( f4 g+ z4 C+ t& B2 `# W) w8 ]) j# e* G6 y9 b0 \, y& J; g, U
13.1 数据基本操作
- P3 Y# Z7 _7 B, c2 [0 z U 本节介绍基本的数据操作,包括工作区的保存、导入和文件打开。9 ]! p8 q; P4 C0 [" o2 q
13.1.1 文件的存储
( q6 b" |6 k, x$ Q MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。
( x/ Q" A; ^, s/ J; l( s 1. 保存整个工作区1 L0 U2 ]( V& w7 W0 t8 q
选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
/ r9 ] z; v$ P/ { 2. 保存工作区中的变量* k( D c; T O9 z7 w+ c/ M
在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
5 D" _3 h. C" |$ i. k4 N' `+ h 3. 利用save命令保存
$ g: _; V0 d k2 q9 y) X5 u- G! H 该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:
3 m% S8 ~8 u% K2 E; Y5 @9 b● save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。
3 t" |# B9 z. G8 p' F E' c) ]● save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。3 c% H6 u# g, y+ R* D1 D
● save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。$ V; J u! i" g; e1 j4 D
● save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
# I! @" _* {2 _ m/ p6 ?● save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
% G) T, _/ Z/ g j3 |, U● save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。1 ?( b* y: o# k7 Z, E
● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。
5 q' ?9 X; l0 {2 z$ w& T6 F13.1.2 数据导入
8 f3 b* ^. a* U7 j MATLAB中导入数据通常由函数load实现,该函数的用法如下:4 z, C: B$ t2 f8 j
● load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。+ U0 G' J9 x1 i7 K0 }( k) I2 [
● load filename:将filename中的全部变量导入到工作区中。$ \3 K* t" ^9 K- Y3 p: W, z9 F
● load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。5 z4 f& m0 A6 H& K2 A- d3 A+ i
● load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
7 @( G6 d4 g8 P: o2 [● load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
, `6 m4 ?0 U) x8 [- T2 m3 p● load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。" {3 c$ b. ?0 L! x; V! } R
例13-1 将文件matlab.map中的变量导入到工作区中。; k0 s& ~8 V) G J: m2 n! I' K$ B
首先应用命令whos –file查看该文件中的内容:" @- R) Z# B, G5 q
>> whos -file matlab.mat
. F# g7 @; a" k Name Size Bytes Class: N# v! H# Z) l' J6 O
A 2x3 48 double array/ y0 I! n* F6 u5 ]: d p
I_q 415x552x3 687240 uint8 array( o- D7 z: A# i
ans 1x3 24 double array
$ V4 N! u: b* R% K, @; o num_of_cluster 1x1 8 double array
0 Z# \3 d9 D( D! e Grand total is 687250 elements using 687320 bytes" `# k" X5 C, D
将该文件中的变量导入到工作区中:
+ o$ r& L' B2 g. k3 ~ >> load matlab.mat
& }+ g$ T t6 ~4 z& F 该命令执行后,可以在工作区浏览器中看见这些变量,如图13-1所示。
" x* U! ] A( A: D) }+ l7 j+ E4 D8 `. N
图13-1 导入变量后的工作区视图
6 q* h4 u3 g7 P$ i3 b/ `( \ 接下来用户可以访问这些变量。4 q# S' B" s5 k+ K$ [' n( N
>> num_of_cluster+ L0 _! s) b% B5 ]$ Z/ T( M8 E- C
num_of_cluster =* _3 d% ^/ n. }& j" a& B
3
' _$ B( F& ?3 h4 P MATLAB中,另一个导入数据的常用函数为importdata,该函数的用法如下:
3 T8 @1 T. E$ ?6 [, A% j, o● importdata('filename'),将filename中的数据导入到工作区中;1 N; h- L* _8 ]9 {7 w/ m
● A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;6 I' u* F# b2 d! W4 N
● importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;
: }0 a. _% a9 o# U" N* o5 B z例13-2 从文件中导入数据。
% t+ B* A8 t, p! s& B5 C2 O5 ] >> imported_data = importdata('matlab.mat')$ I3 p0 U- S, }% ^+ S
imported_data =
2 E' J+ ]& l1 |( | ans: [1.1813 1.0928 1.6534]
7 k; Y) {. V5 T0 o( N' D2 q7 | A: [2x3 double]
6 U* y4 T4 E9 W5 Q+ ?% }3 x" M5 t I_q: [415x552x3 uint8]5 ^, ~! b, U) ~: f% |: V
num_of_cluster: 39 U% U! h1 y: L2 J$ D3 W% f* E
与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。
. K9 H; q. i" U. ?13.1.3 文件的打开/ E# w% U# W N: b
MATLAB中可以使用open命令打开各种格式的文件,MATLAB自动根据文件的扩展名选择相应的编辑器。
V; c3 C/ j( d& P 需要注意的是open('filename.mat')和load('filename.mat')的不同,前者将filename.mat以结构体的方式打开在工作区中,后者将文件中的变量导入到工作区中,如果需要访问其中的内容,需要以不同的格式进行。% v% r# V$ G4 n' `8 q% p4 ^1 n
$ k: a) l0 l$ C5 I" R1 y
例13-3 open与load的比较。
, R' {2 i+ {( K1 y& k1 K) Q0 L >> clear
9 D% J& ~# [8 u7 C+ R" _ >> A = magic(3);
& y% V- p5 b0 L8 W >> B = rand(3);6 f9 E* T# u& A! f$ j) c
>> save
( t( N v/ `3 l5 D& y: _' l; ]' R" l Saving to: matlab.mat
/ o$ \% L- E7 r$ t >> clear
, ]/ z8 w$ C' h) o1 O >> load('matlab.mat')
1 ]# X8 d2 C1 ]7 G4 i >> A
. }9 \: t! ~& v# `) ?+ \; O A =
& e! J1 x& {1 y# y 8 1 67 T% C; \9 `0 G! t8 @" J
3 5 7& V9 E0 ^# _2 Q6 F
4 9 2+ Y& @/ c4 m: X; k1 t
>> B9 ]2 \0 [' h' v' x* S2 T
B =6 K1 C: u& F; k2 `' q: T R8 W1 q
0.9501 0.4860 0.4565
# H( m- H& w) n5 M Y: y- d8 V 0.2311 0.8913 0.0185
9 _0 M% q" I) r" M3 i L+ c& Z% k 0.6068 0.7621 0.8214
6 V& m6 B5 s! k+ M6 U+ Q >> clear
9 M) h/ \; y& ^( L" P9 w3 ] >> open('matlab.mat')6 }) J6 {& ]1 c5 g7 [- T3 s5 R
ans =
h U+ }% c* D. y8 A A: [3x3 double]* d, b, M5 p: l' ?4 Y" i6 u0 r z6 g& z
B: [3x3 double]( ~2 j: w. g, f I6 s7 X, H4 Z
>> struc1=ans;8 i1 s) K( |; ^) R- ^% R. X0 E; p; J
>> struc1.A
9 e7 z3 a7 K7 M$ S) w; E% H ans =
! p E+ q8 T4 g1 V, A- z 8 1 6
* L( A1 K `2 B* G 3 5 7: ], M* b% w8 A" o; @
4 9 2& c7 e( k0 F3 d+ r W
>> struc1.B
6 E, i# _$ @+ e+ n8 w ans =" m8 d5 |2 b% g) d! E+ O; }
0.9501 0.4860 0.4565
1 z, K4 g( o- c4 Y( h& ~ T1 D' r 0.2311 0.8913 0.01852 {4 b3 x/ o% }5 W9 _; [
0.6068 0.7621 0.8214; H% n0 R+ Z+ C
13.2 文本文件的读写- I3 Q) j; \( g* v. \: @
在上一节中介绍的函数和命令主要用于读写mat文件,而在应用中,需要读写更多格式的文件,如文本文件、word文件、xml文件、xls文件、图像文件和音视频文件等。本节介绍文本文件(txt)的读写。其他文件的读写,用户可以参考MATLAB帮助文档。
9 x- d" E% | y$ | MATLAB中实现文本文件读写的函数如表13-1所示。+ l: T8 c- U V( L8 P
表13-1 MATLAB中文本文件读写函数
, x& W4 \6 _; ?2 X3 E函 数- G8 W& E: Q. l* ]
功 能
9 u1 z2 S. D, U! k9 q2 J! `/ l4 fcsvread
; `$ [$ d6 U. b [" u$ E读入以逗号分隔的数据8 b$ y8 L, k7 [; f6 K
csvwrite1 Y' Y) z# b2 y/ R' C* d( ]
将数据写入文件,数据间以逗号分隔0 I5 Z. U) ]: L! {( M
dlmread, F* v+ `4 `1 \% R
将以 ASCII 码分隔的数值数据读入到矩阵中
6 X4 X5 t7 p6 v, r& ^7 @! e( xdlmwrite* _8 h- D/ p% F5 b- `
将矩阵数据写入到文件中,以 ASCII 分隔
* |# _+ b1 n$ Wtextread
( x2 d: Z; j, V; d# r) G1 @: t从文本文件中读入数据,将结果分别保存
~# l9 B6 h1 v& F' Ltextscan2 n4 r4 R; ]1 m/ {0 R0 X4 @
从文本文件中读入数据,将结果保存为单元数组! C$ K) ?& \, E/ r0 u
9 t6 g# v0 ?* D5 y) a/ q
下面详细介绍这些函数。; a- R1 K. p, b8 Y$ s, o$ u6 s
1. csvread、csvwrite. r- }. G) ?1 s! b+ B' f; N
csvread函数的调用格式如下:
{" o+ |% q" D, K W● M = csvread('filename'),将文件filename中的数据读入,并且保存为M,filename中只能包含数字,并且数字之间以逗号分隔。M是一个数组,行数与filename的行数相同,列数为filename列的最大值,对于元素不足的行,以0补充。3 m6 b7 r/ V5 h( @* V2 J
● M = csvread('filename', row, col),读取文件filename中的数据,起始行为row,起始列为col,需要注意的是,此时的行列从0开始。. Z! Z9 e7 N5 M P, l+ Q9 w$ n/ N
● M = csvread('filename', row, col, range),读取文件filename 中的数据,起始行为 row,起始列为col,读取的数据由数组 range 指定,range 的格式为:[R1 C1 R2 C2],其中R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。% ]! m x, K7 {" D% W
csvwrite 函数的调用格式如下:
& z: h! H" f J8 s+ ^0 f s● csvwrite('filename',M),将数组M中的数据保存为文件filename,数据间以逗号分隔。
* R1 ^/ F# R1 q) c( e● csvwrite('filename',M,row,col),将数组M中的指定数据保存在文件中,数据由参数 row和col指定,保存row和col右下角的数据。
8 Y+ r) F" g' {● csvwrite写入数据时每一行以换行符结束。另外,该函数不返回任何值。
; @. f: O) y5 U+ H) h: P4 v 这两个函数的应用见下面的例子。/ G% U! ~- Q/ M
例13-4 函数csvread和csvwrite 的应用。
+ _7 p0 i9 y( \2 X& J% E" M 本例首先将MATLAB的图标转化为灰度图,将数据存储在文本文件中,再将其部分读出,显示为图形。: {# V) \' k4 ?- O, d# K; f
编写M文件,命名为immatlab.m,内容为:
8 E1 X4 R; q, _: b- S5 s# T3 D% u % the example of functions csvread and csvwrite1 Z7 h" V9 M1 T# @. a4 _
I_MATLAB= imread('D:\matlab.bmp'); % read in the image
! X4 Z, r7 ?$ O/ z I_MATLAB= rgb2gray(I_matlab); % convert the image to gray image$ G- F. H: @# ]
figure,imshow(I_matlab,'InitialMagnification',100); % show the image
, {$ ]2 W: U. k: r# ^) y! }; K csvwrite('D:\matlab.txt',I_matlab); % write the data into a text file
$ @5 s1 C4 y3 E9 D( T* ]7 z sub_MATLAB= csvread('D:\matlab.txt',100,100);% read in part of the data. X# ~3 b- z: Y" L2 X7 X5 n5 f: J
sub_MATLAB= uint8(sub_matlab); % convert the data to uint86 Q, d+ v2 r& v+ w2 Q6 t
figure,imshow(sub_matlab,'InitialMagnification',100); % show the new image+ q+ l/ `" w" ~* E
在命令窗口中运行该脚本,输出图形如图13-2所示。& i& c5 _5 S' K. f
& K9 Y" m% ?/ s+ E* I(a) (b)4 U8 {! E! S; i6 l. Q9 m
图13-2 例13-3 的运行结果' j( I& T6 F+ S) G
该例中涉及到了少量的图像处理内容,超出本书的范围,感兴趣的读者可以查阅 MATLAB帮助文档中关于Image Processing Toolbox的介绍。1 Y5 ?4 p1 `, C( [ f' t
2. dlmread、dlmwrite(个人觉得这个比较好用)
5 n0 t) B- J* l% \: T, a dlmread函数用于从文档中读入数据,其功能强于csvread。dlmread的调用格式如下:1 }& u7 i& V7 }9 v* L7 {0 s
● M = dlmread('filename'); P/ u( V7 X9 R1 Z! w
● M = dlmread('filename', delimiter)
! g3 d5 |9 S$ M$ W2 s3 O: o● M = dlmread('filename', delimiter, R, C)
a6 w2 C( Z+ }● M = dlmread('filename', delimiter, range)/ ^$ S5 u9 p( H ?3 o
其中参数delimiter用于指定文件中的分隔符,其他参数的意义与csvread函数中参数的意义相同,这里不再赘述。dlmread函数与csvread函数的差别在于,dlmread函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。
7 Z3 J3 ?0 r. g7 ]/ z. e0 T dlmwrite函数用于向文档中写入数据,其功能强于csvwrite函数。dlmwrite函数的调用格式为:0 |, N* ^ o8 C, @; c+ W0 ^
● dlmwrite('filename', M),将矩阵M的数据写入文件filename中,以逗号分隔。* M' a: n$ [- k3 o
● dlmwrite('filename', M, 'D'),将矩阵M的数据写入文件filename中,采用指定的分隔符分隔数据,如果需要tab键,可以用“\t”指定。) i* } w6 @! a/ U7 B
● dlmwrite('filename', M, 'D', R, C),指定写入数据的起始位置。
: Z$ l+ H& _3 h1 x$ r' L; l9 p● dlmwrite('filename', M, attribute1, value1, attribute2, value2, ...),指定任意数目的参数,可以指定的参数见下表。
8 N$ X ]: s3 U* b. H● dlmwrite('filename', M, '-append'),如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。 @" Z/ }+ F9 W+ S9 x
● dlmwrite('filename', M, '-append', attribute-value list),叙写文件,并指定参数。
0 k5 e( ^0 V# C, }8 x: n# t● dlmwrite 函数的可用参数如表13-2所示。, ?1 V* T. X# F+ L( [8 ?$ s
: l% h0 t! ^: D: n. q% S" ~! E" Y; y1 @! e+ g6 O8 R7 R) |
表13-2 dlmwrite函数的可用参数
% _5 ?; b( Z e$ R+ \参 数 名
6 S0 c4 G0 |5 R8 Q5 G2 j' y- L功 能
; q- E5 ?! d' ~& Bdelimiter4 C& M' ?' a* W* ~- c" {
用于指定分隔符8 ~/ n1 y, Q0 x) {5 [6 ~
newline
& ^$ f2 m2 B' q4 K8 v$ d) S, [用于指定换行符,可以选择“pc”或者“unix”
% U( u0 ]2 E, s& Croffset
/ u- N4 K8 q5 R3 P6 W( |行偏差,指定文件第一行的位置,roffset 的基数为 07 f+ A# ~7 {- C& j
coffset& q$ Z- T6 K8 w
列偏差,指定文件第一列的位置,coffset 的基数为 0
7 k7 Q6 j, R3 I& Q! {+ U, u$ a1 jprecision
. g4 A) r* x" v0 F指定精确度,可以指定精确维数,或者采用 c 语言的格式,如“%10.5f”7 O+ k/ ~) N, F6 M& t. ^1 p
4 _6 O @$ N, U6 h& m. V, l) t 3. textread,textscan
8 F+ m0 z# ?/ v. W 当文件的格式已知时,可以利用textread函数和textscan函数读入。这里只介绍这两个函数应用的实例。1 B, o( l- j; [% ?
例13-5 通过%读入文件,按照原有格式读取。
& Q- ^9 E: K3 z! x% Y5 s文件的内容为:
6 h% C5 U6 G0 L, @ Sally Level1 12.34 45 Yes; E( M A8 ? @0 n7 a ?
在命令窗口中输入:
1 h4 w' Y! K$ D% X" x- a' [ >> [names, types, x, y, answer] = textread('D:\mat.txt','%s %s %f %d %s', 1)
2 \" L7 h- u" d" i' V$ D得到结果为:2 o3 V: m! e! o& T: w( E- F* [) t% S
names = 1 L4 M1 \' i! z G3 E$ E, f
'Sally'
5 l. I q- ~* c! A' U types =
. |& a5 `9 U: V+ t5 _$ l: N 'Level1' E- ]5 A7 n3 D$ i
x =
5 u0 P/ _, [3 m$ `& S 12.34000 ?6 Y u7 u4 r T9 z5 f" f
y =
6 U; @6 b& |3 k3 b1 D. R 45. X$ r+ h+ g' _3 v% d. f/ @
answer = * K* u0 Z5 K& o+ l
'Yes'
$ a! Y( ?* e& X$ Q 1 E( i$ p, U1 Z! J7 ^
5 _9 X. I" ]' c7 I& {
例13-6 函数csvread和csvwrite的应用7 o J1 O7 F( I9 w
Sally Level1 12.34 45 1.23e10 inf NaN Yes: X$ C( E) ?3 K3 x
Joe Level2 23.54 60 9e19 -inf 0.001 No
+ k% G7 Y7 W' B9 h% [4 g Bill Level3 34.90 12 2e5 10 100 No2 M X, P( F, j/ \! O, u
>> fid = fopen('D:\mat.txt');& C( G b& X! G* h& F% F8 D& j) l
>> C = textscan(fid, '%s %s %f32 %d8 %u %f %f %s');, k& g* v1 t' N" v
>> fclose(fid);+ L2 ]* j& B* l0 u
13.3 低级文件I/O& W5 Q1 P, Z) p+ |# D
本节介绍一些基本的文件操作,这些操作如表13-3所示。
* k# F5 D3 ~, K5 w$ a表13-3 MATLAB的基本文件操作6 a/ V$ c& j6 u# T9 r* \7 k
函 数
0 @7 A" \3 `. \3 y3 G功 能
4 x e* e8 b. D fclose
/ A1 Y9 Z/ n" T4 E: N7 d7 f) V# s; _关闭打开的文件
; i8 _7 X0 L+ }/ r0 d- i( [5 \ feof
% ^1 ^. ^: K/ U# @6 f判断是否为文件结尾$ }$ T3 ]% e+ t
ferror
, |2 j0 y- e8 \) |. K: M6 ~文件输入输出中的错误查找- C) }5 X, t. F' ^4 q2 b/ ?
fgetl
" O! p" {7 @" ~+ B读入一行,忽略换行符
. W$ E t; o" m' Y1 \ fgets. d' G, p8 I' | F$ P* g
读入一行,直到换行符
. J5 K w* G* H# y5 p0 Y$ v% R ` fopen
" N3 T4 n; o9 g2 h$ S6 M) f+ H打开文件,或者获取打开文件的信息" V! H$ `8 i1 R) F+ z
fprintf
$ c* H1 n( z+ r6 F; ~" d格式化输入数据到文件9 o( n- W6 ~, g2 X
fread5 ?+ M7 j* x. ?5 p7 W7 q7 r
从文件中读取二进制数据/ o" i! Y3 F- W( X! f' E
frewind
; x* E- }6 N+ p. @. u; r3 i将文件的位置指针移至文件开头位置
6 }: i( H7 u \" X g fscanf+ ^3 M7 W4 f& X, L% @
格式化读入
/ G7 J, Z% p* S* B; c; s( K8 E fseek* Q8 z5 J% J j2 Z. n. \- X8 W: i. M
设置文件位置指针( F4 w5 S$ D u. H! t
ftell4 @; q2 f& h8 T e8 R
文件位置指针6 ]' A* ~. Y, B
fwrite
, } B( N4 i. [6 a B0 A7 [: j向文件中写入数据
6 _5 W% P) `) _1 P% F+ g8 \ `8 g, X4 x
# g; W5 n5 G/ l7 W 下面重点介绍函数fprintf。该函数的调用格式如下:7 s; T* n9 K t6 u6 Q* \ p
count = fprintf(fid, format, A, ...),该语句将矩阵A及后面其他参数中数字的实部以 format 指定的格式写入到fid指定的文件中,返回写入数据的字节数。! S! R5 }# B4 F% Q
上面语句中,参数format由%开头,共可由4个部分组成,分别如下:0 [8 {8 O! e6 S7 ?' C% b
● 标记(flag),为可选部分。
: s& t# y, a2 a: d; q● 宽度和精度指示,为可选部分。
0 F2 p5 a4 f1 ^! c: u● 类型标志符,为可选部分。
4 C0 G( ~% a+ d, v5 d' P. k: ~$ Y● 转换字符,为必需部分。
& {0 H2 d0 C9 g/ @/ T, ~ 1. 标记
6 B/ l! e" a" ]& d3 G8 U/ ?; G/ d: U 标记用于控制输出的对齐方式,可以选择的内容如表13-4所示。; I: n5 b0 c" k0 E/ D: ?
表13-4 标记的可选内容, r7 f9 Q! m7 B2 I
函 数
# |$ l7 e) O- R, A. _* J$ Z' F$ @功 能
3 U' A+ p4 M2 a: [2 Q8 `% j' m0 i示 例, p5 w" k! G, w; M) x3 p
负号(-)" D8 o B* l1 {0 U
在参数左侧进行判别$ c* d# p1 d+ v
%-5.2d" v. ]) H9 s) C' q( o
加号(+)
% {% I! S) L' Z 在数字前添加符号
* _5 t. B% X0 j9 }" p: X# c! a %+5.2d
5 S7 j% f+ y2 l, ? s2 j: B/ E 空格
6 f8 C, y; L7 d; e" g 在数字前插入空格
, D, @! w% m+ r* n( ?& d % 5.2d
/ K" K) F: w; `7 `: o$ V8 F7 I 0
# C3 o+ F5 |: `' O 在数字前插入0, ~9 Z h) q( J
%05.2d9 O; W- {$ S& A
2. 宽度和精度指示. U b& M( {+ o6 d) G
用户可以通过数字指定输出数字的宽度及精度,格式如下:5 H& {# x1 n1 Y, g- {( B( h8 v
● %6f,指定数字的宽度;$ x- W& [+ K1 Q5 q& w
● %6.2f,指定数字的宽度及精度;: U6 L* x. P# x* O+ p* ^+ p
● %.2f,指定数字的精度。
# C% B9 L- F/ N7 Z' L1 W例13-6 fprintf函数宽度和精度指示符示例。
& X4 i1 ]! S1 G" X" J 在命令窗口中输入如下命令:+ {. q* C& J$ j: i. i" N
>> file_type = fopen('D:\type.txt','w');
* j( K4 Y; X, C' T; z >> fprintf(file_h, '%6.2f %12.8f\n', 1.2, -43.3);% ^ V0 r. z" q5 {* T! U6 g
>> fprintf(file_h, '%6f %12f\n', 1.2, -43.3);
8 k0 q8 u* a6 s9 B >> fprintf(file_h, '%.2f %.8f\n', 1.2, -43.3);
( |! B$ o& `. u7 n6 Q >> fclose(file_h)
5 l3 ^3 _+ f4 k ans =
( i0 W/ C- C( ]3 k9 @- v! u" L 0
* g" L9 }, Z9 _( U* V f9 T 打开该文件,其内容为:+ x4 v2 O- Q3 w4 n7 T0 R4 a
1.20 -43.30000000: Y$ G: J' q5 \$ P& W
1.200000 -43.300000- C6 ]& M/ H, ?3 D
1.20 -43.300000006 L) f6 U3 t; w9 |2 G* A+ r$ ~' F
从上述结果可以看出宽度和精度控制的效果。
! k$ G! w3 c7 J9 J3 q& T 3. 转换字符4 w" T5 c) P* i; P$ N" u
转换字符用于指定输出的符号,可以选择的内容如表13-5所示。7 m& B% G" ~9 ?' P5 G7 q9 M( s
表13-5 格式化输出的标志符及意义
& z5 |; A6 ^) F& O: Q( G标 志 符
1 {2 h6 Q O+ q7 P: l, f, M! Y* ~意 义
% E7 B( ?/ [# P/ x. K( i4 O %c
( w" n( f) w7 Y; X5 m S3 e输出单个字符
1 Q$ J, q- }+ f9 @- S* Q( o1 z %d8 q! Q2 |3 F4 Z' ?6 R7 D% n
输出有符号十进制数- P) R B9 |' J" Q, \9 ?) m
%e
/ Y- x. B c; K/ R5 p' l采用指数格式输出,采用小写字母 e,如:3.1415e+00
1 ^; b6 |6 {' n a. l/ w+ M& a" X(续表) # u" G# I" f' ]& p% U
标 志 符3 `! ~9 d5 [$ w( I& B8 i& a4 }
意 义
3 B+ b* s' N0 ^, ?: l %E
( n( i/ ]7 V V/ r1 e \采用指数格式输出,采用大写字母 E,如:3.1415E+003 |9 M) b. G: V8 q) S+ r
%f) y8 E; U3 P2 \- O9 g, u
以定点数的格式输出
7 x9 g% G- {( g* V. E' N %g: H1 T4 x+ }3 |) y# N
%e及%f的更紧凑的格式,不显示数字中无效的 0$ S" O! R' X, o! `7 H: K
%G( e( T% i# y2 B4 ^0 E% n y
与%g相同,但是使用大写字母E& O3 T% h# g B" H
%i2 q* @- |) `8 T, K6 F! D; }
有符号十进制数) L8 J' I$ p$ `$ g
%o
* B+ h; q) L. D9 o- w8 \+ I无符号八进制数( e. G' A) A0 o1 A8 s% N0 A% ?
%s- e; ]9 _* k. o! E, r( V/ t
输出字符串4 d7 S6 G! K6 ]% b2 y
%u
; @; J$ s7 V- w7 r/ I: V无符号十进制数! r5 `+ L( _3 Y- v0 j* O
%x2 G! e# q2 w q, j; A# [9 M3 o
十六进制数(使用小写字母a-f)
" l, y, t# X' A6 T F$ N %X; t) T- @& g3 ]: C
十六进制数(使用大写字母A-F)
" u+ o' h" a& L1 A7 [$ F W5 k T4 x$ r$ X- {
其中 %o、%u、%x、%X支持使用子类型,具体情况这里不再赘述。格式化输出标志符的效果见下面的例子。
; S! ?3 c* c( p+ ^例13-7 fprintf 格式化输出示例。
$ v! }( I2 V/ E' x* E% ?2 l( y$ s. K >> x = 0:.1:1;
; A0 z: Z5 f. ]9 W >> y = [x; exp(x)];6 @' h3 ^% ~ S# [* Z5 s: a
>> fid = fopen('exp.txt', 'wt');
' w5 |# T) n) ^2 x2 I: ?+ i4 l >> fprintf(fid, '%6.2f %12.8f\n', y);
# {! G8 O/ M8 g9 r& y7 H: ] >> fclose(fid)5 Z( _% Z/ g6 \1 E) Y0 }
ans =
+ B, M2 [1 A: i) j. q( k 01 h$ J/ }- p; F) L3 K. M' [$ L' P
显示该文件:- }, q2 q, t: L+ H
>> type exp.txt6 K: {' J7 a- u, C
0.00 1.00000000- {5 i1 G' J5 Z
0.10 1.10517092$ n8 ^/ C: d+ F3 n. V s9 X4 W
…
: k, N# r: W' |1 f- S2 {9 s 0.90 2.45960311+ P' e: C8 U. q0 q
1.00 2.71828183
& j& G+ H+ |& X( p4 w 例13-9 利用 fprintf 函数在显示器上输出字符串
4 Y/ O. J# M9 P2 U- ^0 X3 v >> fprintf(1,'It''s Friday.\n')
7 b* v# j6 A% V1 f1 k# u4 I5 ~; U It's Friday.( X- ~) K& u: }
在该例中,利用1表示显示器,并且用两个单引号显示单引号,使用\n进行换行。在格式化输出中,这类符号称为转义符。MATLAB中的常用转义符如表13-6所示。
- o' Q5 V( W1 r7 {, a 4 Z9 O5 q5 k+ x; z6 Q" p% Y2 I
3 ]1 L( B: D9 L3 H2 z4 X1 \2 Y. X: ?
表13-6 MATLAB中的常用转义符
% P! R% p0 T, D# ?转 义 符
1 z' H& X' v/ z# s0 I4 d( \功 能$ z S( P' k9 M6 j
\b 退格 L4 q! }% E8 f% n" a
\f 表格填充
/ {8 x9 d, S( b \n 换行符
* c4 S5 E4 V i/ f2 b8 D \r 回车
9 H7 v0 j# t* Q7 j; ~ \t tab2 q) |$ s. O7 c5 O: X8 [
\\ 反斜线4 [/ D% i% s4 t; v8 ] W j5 D
\'' 或 '' 单引号3 y( L5 S1 y3 V% T6 }
%% 百分号
% _, w0 R I0 ~13.4 利用界面工具导入数据) L; |5 K/ C+ A3 e$ Q
除前面几节介绍的函数外,也可以通过界面工具将数据导入到工作区中。本节介绍利用工作区浏览器中的工具导入数据。
7 x! o! U2 D& n- Q3 v! I 选择工作区浏览器工具栏中的“Import Data”,选择待导入的文件,这里我们选择了一个文本文件,其内容为逗号分隔的数字,打开窗口如图13-3所示。
. c& j* s( R! z8 v& U8 q! X* N$ G) Y5 k
|
|