第三章 MATLAB程序设计基础
chapter 3,Foundation of MATLAB program design
数据及数据文件(Data and Data file)
1,数据类型:(Data mode) 用于编程和计算的数据类型(表 3—1)
数组:
字符数组(Character array)、
数值数组(Numeric array)—
包括整形(int8,uint8,int16,uint16,int32,uint32)单精度(signal),双精度(duble)(MATLAB最常用的变量类型),稀疏(sparce)数组。、
Int--- Integrate.
Uint---Unsigned INTeger data
单元数组(Cell array)、
结构数组(Structure array)
Java类(Java class)
函数句柄(Function handle)
在工作空间浏览器中不同的数据类型有着不同的图标标识,(见图 3—2)_
2,数据文件(Data file)
MATLAB支持的各种数据文件(Readable file formats of MATLAB)及其调用方法和返回值见(表 3—2)
(1)二进制数据文件:(Binary date file) 以.mat为扩展名。是标准的MATLAB数据文件,以二进制编码形式存储。.mat文件可以由MATLAB提供的save和load命令直接存取。
(2)ASCⅡ码数据文件:(ASCⅡ code data file)扩展名为.txt,.dat等,可以是在MATLAB环境下存储的,也可能是其他软件的计算结果,可以被MATLAB调用,也可以用文本编辑器打开进行观察与修改。 可以用save和load命令进行读入和存取。
(3).图象文件:(Graphics file) 扩展名为.bmp,.jpg,tif等,用于图形图象处理,可以用imread和imwrite命令进行读入和存取。
(4).声音文件,(Sound file) 扩展名为.wav,用waveread 和 wavwrite命令进行读入和存取。
Readable file formats,
Data formats Command Returns
MAT- MATLAB workspace load Variables in file.
CSV- Comma separated numbers csvread Double array.
DAT- Formatted text importdata Double array.
DLM- Delimited text dlmread Double array.
TAB- Tab separated text dlmread Double array.
Spreadsheet formats
XLS - Excel worksheet xlsread Double array and cell array.
WK1- Lotus 123 worksheet wk1read Double array and cell array.
Scientific data formats
CDF - Common Data Format cdfread Cell array of CDF records
FITS- Flexible Image Transport System fitsread Primary or extension table data
HDF - Hierarchical Data Format hdfread HDF or HDF-EOS data set
Movie formats
AVI - Movie aviread MATLAB movie.
Image formats
TIFF - TIFF image imread Truecolor,grayscale or indexed image(s).
PNG - PNG image imread Truecolor,grayscale or indexed image.
HDF - HDF image imread Truecolor or indexed image(s).
BMP - BMP image imread Truecolor or indexed image.
JPEG - JPEG image imread Truecolor or grayscale image.
GIF - GIF image imread Indexed image.
PCX - PCX image imread Indexed image.
XWD - XWD image imread Indexed image.
CUR - Cursor image imread Indexed image.
ICO - Icon image imread Indexed image.
RAS - Sun raster image imread Truecolor or indexed.
PBM - PBM image imread Grayscale image.
PGM - PGM image imread Grayscale image.
PPM - PPM image imread Truecolor image.
Audio formats
AU - NeXT/Sun sound auread Sound data and sample rate.
SND - NeXT/Sun sound auread Sound data and sample rate.
WAV - Microsoft Wave sound wavread Sound data and sample rate.
3,数据输入向导(Import wizard)
File 菜单下的工具Import Wizard用于将各种类型数据文件中的数据导入工作空间,称为数据输入向导。在 Import 对话框中输入需要导入的数据文件名后出现Import Wizard窗口,可预观测将要导入的数据、显示图象、播放声音等。
几种数据的导入:
mat数据文件( mat data file)
调入途径,File 输入文件名,也可用Browse打开文件浏览器选择输入文件;Clipboard,数据从剪贴板中调入。
窗口内容:左侧,变量名称、大小、类型。右侧观察前10行10列信息。
Next,显示数据输入向导窗口第二页。
(2)ASCⅡ码数据文件:(ASCⅡ code data file) 输入ASCⅡ数据文件名---选择显示数据内容 (data)或头文本内容(textdata)---选择Next下一页进行导入内容选择(通过钩选决定将何变量导入工作空间)---- 按Finish 完成导入操作或按Cancel终止数据的导入。
(3)图象数据文件:(Graphics data file) 输入图形数据文件名---点击show image(可在图象上拖曳放大区域)------按Finish 完成数据导入(或按Cancel终止数据导入)。
(4)声音数据文件:(Sound data file) 输入声音数据文件名---点击Play Sound弹出一个显示声音数据波形的图形窗口(按Play agine按钮重新播放声音,按Done按钮关闭预观察窗口)------按Finish 完成数据导入(或按Cancel终止数据导入)。
(5)剪贴板的数据:(Clipboard data) 需要导入已存放在系统剪贴板中的数据,点数据输入向导窗口中的Clipboard选项,--Next进入下一页--按Finish 完成数据导入(或按Cancel终止数据导入)。
二,M文件(M-file)
MATLAB 的两种工作方式:1,交互式命令操作方式(interactive mode)—通过命令窗口进行交互式操作;2,M文件(M-file) 的编程工作方式(programming mode)。
M文件编程:(M-file program)可用普通文本编辑器编制 MATLAB文件,文件由纯ASCⅡ字符组成,确定文件名后加.m扩展名,称为M文件。
MATLAB提供了一个方便的编辑/调试器,功能较多,推荐使用。
建立M文件的一般步骤:(normal process of M- file creating)
打开文件编辑器:(Opening the file editor) 最简单的方法是在操作桌面的工具栏上选择新建文件键(New M- File)或打开已有文件键(Open File),也可以在命令窗口输入命令edit建立新文件或输入edit filename,打开名为filename 的M文件;
编写程序内容:(Compose the program content) 编写新的文件或修改已有文件;
保存文件:(save file) 文件运行前必须完成保存操作,与一般的文件编辑保存操作相同;
运行文件:(running file) 在命令窗口输入文件名即可运行。如要在编辑器中直接完成运行,可在编辑器的Debug菜单下save and run选项,或按Run快捷键,最快捷的方法是直接按F5键执行运行。
M文件有两种形式:命令文件(Script File)和函数文件(Function File)
2,命令文件,(Script File) M文件中最简单的一种,是可用于自动重复执行的一组MATLAB命令和函数组合,不需输出输入参数,用M文件可以调用工作空间已有的变量或创建新的变量。运行过程中产生的变量都是全局变量。
建立一个命令文件等价于从命令窗口中顺序输入文件里的命令,程序不需要预先定义,只要依次将命令编辑在命令文件中,再将程序保存成为扩展名为.m的M文件即可。
运行命令文件时,只需在命令窗口键入文件名即可。
例:用三角函数计算画出花瓣图形。
theta=-pi:0.01:pi;
rho(1,:) =2*sin(5*theta).^2; %计算四种不同rho
rho(2,:)=cos(10*theta).^3;
rho(3,,)=sin(theta).^2;
rho(4,,)=5*cos(3.5*theta).^3;
for k = 1:4
Subplot(2,2,k),
polar(theta,rho(k,,))
end
将程序保存成名为petals的M文件,并运行。
注:
‘%‘引导注释行,不予执行;
不需要用“end”最为M文件的结束标志;
若文件存放在自己的目录上,在运行文件前,应先将自己的目录设置为当前工作目录。最简单方法:在当前目录浏览器中设置。
运行后存放在工作空间的变量可以用工作空间浏览器查看。
3。函数文件(Function File)
如果M文件的第一个可执行行以function开始,便是函数文件,每一个函数文件定义一个函数。函数文件区别于命令文件之处在于命令文件的变量在文件执行完成后保留在工作空间中,而函数文件内定义的变量只在函数文件内起作用,文件执行完后即被清除。
例:建立average函数用于计算矢量中单元的平均值。
function y = average(x)
%AVERAGE Mean of vector elements.
%AVERAGE(X),Where X is a vector,is the mean of vector element.
%Non-vector input results in an error.
[m,n]=size(x);
if(~((m==1) | (n==1)) | (m==1& n==1))
error(' Input must be a vector')
end
y=sum(x)/length(x);
将文件存盘,缺省状态下自动存储名为average.m的函数。这样只要接受一个输入参数便可计算返回一个输出参数,与其他MATLAB函数一样使用。
例:用已建立的average函数文件求1~99的平均值。
z=1:99;
average(z)
函数文件的基本组成部分:
(1)函数定义行:(the lines for function identification) 由function 引导,并定义函数名、输入参数和输出参数,函数定义行必须放在文件的第一个可执行上。可以设多个输入输出参数,如,function[x,y,z]=sphere(theta,phi,rho)
也可以没有输出参数,如:
function printresults(x)
H1行:(Lines H1) lookfor查询时使用的;
帮助文本:(Help text) 建立在线查询信息;
函数体,(Function body) 包含全部的用于完成计算及给输出参数赋值等工作的语句;
注释:(explanatory notes) 以%起始导行尾结束部分的说明文字。可放置在程序中的任何部位。
局部变量与全局变量 (Local variable and Global variable)
用global就可以把一个变量定义为全局变量。MATLAB中变量名是区分大小写的,习惯上常将大写字母定为全局变量。如:
global A B C
三,程序结构(Structure of program)
8种控制程序流程(control flow statement) 的语句:for,while,if,switch,try,continue,break,return
1。循环语句(Loop statement)
(1) for语句:
for v=表达式 通常为一个矢量 形式为,m:s:n
语句体
end
例:
n=10
for i=1:n
x(i)=(i+1).^2;
end
x
x =
4 9 16 25 36 49 64 81 100 121
例:嵌套循环:注意与end的配对。
m=3; n=4;
for i=1:m
for j=1:n
a(i,j)=1/(i+j-1);
end
end
format rat
a
a =
1 1/2 1/3 1/4
1/2 1/3 1/4 1/5
1/3 1/4 1/5 1/6
例,运用非1步长,产生0-20 以内的偶数
for i=0:2:20
a(i/2+1)=i ;
end
a
a =
0 2 4 6 8 10 12 14 16 18 20
(2).While语句:为条件循环语句。循环不确定次数,只要表达式的结果非零,语句体就重复执行,直到循环条件不成立为止。
While 表达式语句体
end
例:while循环,求解n!达到100位数的第一个n是多少。
n=1;
while prod(1:n)<1e100
n=n+1;
end
n
n =
70
2,条件语句(Selection statement)
(1) if—end语句(simple if statement)
if 表达式语句体
end
(2)if—else--end语句
if 表达式语句体1;
else
语句体2:
end
当计算的表达式结果为真时执行语句体1,结果为假时执行语句体2。
例:判断学生是否通过学业。
if ((attendance>=0.90) & (grade>=60))
pass=1;
else
fail=1;
end
if—elseif—end语句
if 表达式 1
语句体1;
elseif 表达式2
语句体2;
else
语句体3;
end
例,用色彩区分数据点的范围。
n=100;
x=1:n;
y=randn(1,n);
hold on
for i=1:n
if y(i)<-1
plot(x(i),y(i),'*g')
elseif y(i)>=-1 & y(i)<=1
plot(x(i),y(i),'ob')
elseif y(i)>=1
plot(x(i),y(i),'xr')
end
end
hold off
(3) 分支语句:switch—case—end
通过对某个变量值的比较做各种不同的执行选择。
形式:
switch 表达式(数字或字符串)
case 数字或字符串1
语句体 1;
case 数字或字符串2
语句体 2;
……
otherwise
语句体 n;
end
例:检查input_num的数值.
switch input_num
case -1
disp(‘negative one’); %当input_num=-1时显示
case 0
disp(‘zero’); %当input_num= 0时显示
case 1
disp(‘positive one’); %当input_num= 1时显示
otherwise
disp(‘other value’); %当input_num等于其他值时显示
end
(4) 检测语句:(Detect statement)
try-catch语句用于检测错误并改变流程,形式:
try
语句体 1
catch
语句体2
end
先执行try下面的语句体1,如没有错误,就跳出该结构,如出错误,则执行catch语句下面的语句体2。可用lasterr函数查询错误信息,查询结果为空字符串时表示语句体1成功执行。
例,判断错误语句的用法
n=4;
a=magic(3)
try
a_n=a(n,:),%取a的第n 行元素
catch
a_n=a(end,,),%如取a的第n 行出错,则改取a的最后一行
end
lasterr %显示出错原因
a =
8 1 6
3 5 7
4 9 2
a_n =
4 9 2
ans =
Index exceeds matrix dimensions.
(5)其他流程控制语句:(Other control flow statement)
(a),continue语句:用于控制for循环和while循环跳过某些执行语句。
例,continue语句的用法.
fid=fopen('magic.m','r'); %打开文件
count=0; %计数器置零
while ~feof(fid) %判断是否到文件末尾
line=fgetl (fid);
if isempty(line) | strncmp(line,'%',1)
%判断是否为空行或注释行
continue %如果是空行或注释行继续下一次循环
end
count=count+1; %如果不是空行或注释行计数器加1
end
disp(sprintf('%d lines',count)); %显示行数
25 lines
(b),break语句:用于终止for循环和while循环的执行.
例:break语句的用法.
fid=fopen(‘fft.m’,’r’); %打开文件
s=’ ‘; %清空字符数组
while ~feof(fid) %判断是否为文件末尾
line=fgetl(fid); %从文件中读行
if isempty(line) %如果是空行
break %如果是空行退出循环
end
s=strvcat(s,line); %如果不是空行,丛向连接字符数组
end
disp(s) %显示字符数组结果
(c )return语句,用于终止当前的命令序列,并返回到调用的函数或键盘。
例:return语句的用法.
function d=det(A) %定义函数det(A) 计算矩阵A的行列式
if isempty(A) %如果矩阵是空的
d=1;
return %返回调用函数
else
… %计算过程略
end
四,数据的输入与输出 (Date input and output)
1.数据的输入(Data input)
常用方法:
键盘输入:(keyboard input) 数据少时较方便,多时不益使用;
用M文件产生数据:(Generate data by M-file) 使用于较多数据的输入;
(C) 从ASCⅡ码文件装载数据:(Load data from ASCⅡ code file)
对文本格式的数据文件可用load命令直接读入MATLAB,其内容存放在以文件名命名的变量中利用fopen,fscanf,fread及 MATLAB其他低层 I/O命令读取数据,用于读取其他外部应用程序建立的各种特定格式的数据。
2。数据的输出(data output)
利用diary命令输出语句,运行diary命令可以在当前工作目录上产生一个名为diary的日记文件,文件内容可以输出。关闭日记文件的命令为dairy off.
利用Notebook获取数据:于dairy 用法相仿优点是文字质量高,版面规范,且M-book中的命令可以随时运行或修改,MATLAB工作空间中的数据随之改变。运行Notebook要求计算机上装有MS-Word。
NOTEBOOK Open an m-book in Microsoft Word (Windows only),
NOTEBOOK,by itself,launches Microsoft Word and creates a new m-book called "Document 1."
NOTEBOOK(FILENAME) launches Microsoft Word and opens the m-book FILENAME.
NOTEBOOK('-SETUP') runs an interactive setup function for the Notebook,The user is prompted for the version of Microsoft Word and the locations of several files,
NOTEBOOK('-SETUP',WORDVER,WORDLOC,TEMPLATELOC) sets up the Notebook using the specified information,WORDVER is the version of Microsoft Word (one of '97' or '2000' or '2002'),WORDLOC is the directory containing winword.exe,and TEMPLATELOC is a Microsoft Word template directory.
Examples:
notebook
notebook c:\documents\mymbook.doc
notebook -setup
For the case in which Microsoft Word 97 (winword.exe) resides in the
C:\Program Files\Microsoft Office 97\Office directory,and the Microsoft Word templates reside in the C:\Program Files\Microsoft Office 97\Templates directory,wordver = '97'; wordloc = 'C:\Program Files\Microsoft Office 97\Office'; templateloc = 'C:\Program Files\Microsoft Office 97\Templates'; notebook('-setup',wordver,wordloc,templateloc)
(c) save命令输出数据:将当前内存中的变量存到文件中去。
(d) 利用fopen,fprintf,fwrite及其他底层I/O命令输出特殊格式的数据:如需要在其他外部应用程序中使用MATLAB输出的特定格式的数据,使用此方法。
3,Save 和load命令的使用(Using commend Load and Save)
(1) save(将工作空间的变量存入磁盘)命令的常用调用方法
save,将工作空间所有的变量以二进制格式存入名为matlab.mat的缺省文件;
(a) save dfile,将工作空间所有的变量以二进制格式存入dfile.mat文件,扩展名自动产生
(b) save dfile x,只把变量x以二进制格式存入dfile.mat文件,扩展名自动产生
(c) save dfile.dat x-ascii,将变量x以8位ASCⅡ码形式存入dfile.mat文件;
(d) save dfile.dat x-ascii-double,将变量x以16位ASCⅡ码形式存入dfile.mat文件;
(e) save(fname,‘a’,‘-ascii’),fname 是一个预先定义好的包含文件名的字符串,该用法将变量a以ASCⅡ码格式存入fname定义的文件中。
(2) load命令的常用方法(usual application of command load)
(a) load,把磁盘matlab.mat的内容读入内存;
(b) load dfile,将磁盘文件 dfile.mat内容读入内存;
(c) load dfile.dat,将磁盘文件 dfile.mat内容读入内存,这是一个ASCⅡ码文件,系统自动将文件名定义为变量名;
a=load(fname),fname是预先定义好的包含文件名的字符串,将由fname定义文件名的数据文件调入a中。
附:
1、命令窗口数据直接输入输出语句(Input)
可利用语句中输入的字符串内容提示用户在命令窗口直接输入程序运行所需的某些参数,
调用格式:
R = INPUT('How many apples'),
执行后出现提示字符串,输入的内容可以是MATLAB可估值的任何表达式.输出保存在变量R中。
R = INPUT('What is your name','s'):
执行后出现提示字符串,等待字符串输入,字符串直接输出为MATLAB字符串形式。
INPUT Prompt for user input,
R = INPUT('How many apples') gives the user the prompt in the text string and then waits for input from the keyboard,The input can be any MATLAB expression,which is evaluated,using the variables in the current workspace,and the result returned in R,If the user presses the return key without entering anything,INPUT returns an empty matrix.
R = INPUT('What is your name','s') gives the prompt in the text string and waits for character string input,The typed input is not evaluated; the characters are simply returned as a MATLAB string.
The text string for the prompt may contain one or more '\n',The '\n' means skip to the beginning of the next line,This allows the prompt string to span several lines,To output just a '\' use '\\'.
例:编制可由命令窗口输入被处理温度数据的程序。
k=input('选择转换方式(1--摄氏转换为华氏,2--华氏转换为摄氏):');
if k~=1 & k~=2
disp('请指定转换方式')
return
end
tin=input('输入待转变的温度(允许输入数组):');
if k==1
tout=tin*9/5+32; % 摄氏转换为华氏
k1=2;
elseif k==2
tout=(tin-32)*5/9; % 华氏转换为摄氏
k1=1;
end
str=[' (C';' (F'];
disp(['转换前的温度',' ','转换后的温度'])
disp([' ',num2str(tin),str(k,:),' ',num2str(tout),str(k1,:)])
%不同的样条插值函数应用方法:
yi=interp1(x,y,xi,‘method’)
yi=method(x,y,xi)
例,有一正弦衰减数据y=sin(x).*exp(-x/10),其中x=0:pi/5:4*pi,用三次样条法进行插值。
未插值:
x0=0:pi/5:4*pi;
y0=sin(x0).*exp(-x0/10);
plot(x0,y0)
方法1:x0=0:pi/5:4*pi;
y0=sin(x0).*exp(-x0/10);
x=0:pi/20:4*pi;
y=spline(x0,y0,x);
plot(x0,y0,'or',x,y,'b')
方法2:x0=0:pi/5:4*pi;
y0=sin(x0).*exp(-x0/10);
x=0:pi/20:4*pi;
y=interp1(x0,y0,x,’splin’)
plot(x0,y0,'or',x,y,'b')