Matlab基础入门教程
更新时间:2023-09-09 23:51:01 阅读量: 教育文库 文档下载
Matlab用法简介
绪 论
Matlab是“Matrix Laboratory”的缩写,意为“矩阵实验室”,是当今美国很流行的科学计算软件.信息技术、计算机技术发展到今天,科学计算在各个领域得到了广泛的应用.在许多诸如控制论、时间序列分析、系统仿真、图像信号处理等方面产生了大量的矩阵及其相应的计算问题.自己去编写大量的繁复的计算程序,不仅会消耗大量的时间和精力,减缓工作进程,而且往往质量不高.美国Mathwork软件公司推出的Matlab软件就是为了给人们提供一个方便的数值计算平台而设计的.
Matlab是一个交互式的系统,它的基本运算单元是不需指定维数的矩阵,按照IEEE的数值计算标准(能正确处理无穷数Inf(Infinity)、无定义数NaN(not-a-number)及其运算)进行计算.系统提供了大量的矩阵及其它运算函数,可以方便地进行一些很复杂的计算,而且运算效率极高.Matlab命令和数学中的符号、公式非常接近,可读性强,容易掌握,还可利用它所提供的编程语言进行编程完成特定的工作.除基本部分外,Matlab还根据各专门领域中的特殊需要提供了许多可选的工具箱,如应用于自动控制领域的Control System工具箱和神经网络中Neural Network工具箱等.
第一节 Matlab的安装及使用
§1.1 Matlab的安装
Matlab有各种版本,早期有Matlab 1.0 for 386的DOS版本,后来逐步发展.这里介绍的版本是Matlab 6.x for Windows.因为它使用方便,界面美观,我们选择它作为主要讲解版本.Matlab还有许多附加的部分,最常见的部分称为Simulink,是一个用作系统仿真的软件包,它可以让您定义各种部件,定义各自对某种信号的反应方式及与其它部件的连接方式.最后选择输入信号,系统会仿真运行整个模拟系统,并给出统计数据.Simulink有时是作为Matlab的一部分提供的,称为Matlab with Simulink版本.Matlab还有许多工具箱,它们是根据各个特殊领域的需要,用Matlab自身的语言编写的程序集,使用起来非常方便.您可以视工作性质和需要购买相应的工具箱.常见的工具箱有: Signal Process System Identification 系统辨识 信号处理 Optimization Neural Network 优化 神经网络 Control System Spline 自动控制 样条 Symbolic Math Image Process 符号代数 图像处理 Nonlinear Control Statistics 非线性控制 统计 §1.2 Matlab基本用法
从Windows中双击Matlab图标,会出现Matlab命令窗口(Command Window),在一段提示信息后,出现系统提示符“>>”.Matlab是一个交互系统,您可以在提示符后键入各种命令,通过上下箭头可以调出以前打入的命令,用滚动条可以查看以前的命令及其输出信息.
如果对一条命令的用法有疑问的话,可以用Help菜单中的相应选项查询有关信息,也可以用help命令在命令行上查询,您可以试一下help、help help和help eig(求特征值的函数)命令.
5
下面我们先从输入简单的矩阵开始掌握Matlab的功能.
§1.2.1输入简单的矩阵
输入一个小矩阵的最简单方法是用直接排列的形式.矩阵用方括号括起,元素之间用空格或逗号分隔,矩阵行与行之间用分号分开.例如输入:
A=[1 2 3 ; 4 5 6 ; 7 8 0] 系统会回答
A =
1 2 3 4 5 6 7 8 0
表示系统已经接收并处理了命令,在当前工作区内建立了矩阵A. 大的矩阵可以分行输入,用回车键代替分号,如:
A=[ 1 2 3
4 5 6 7 8 0 ]
结果和上式一样,也是
A =
1 2 3 4 5 6 7 8 0 §1.2.2矩阵元素
Matlab的矩阵元素可以是任何数值表达式.如:
x=[ -1.3 sqrt(3) (1+2+3)*4/5] 结果:
x =
-1.3000 1.7321 4.8000
在括号中加注下标,可取出单独的矩阵元素.如:
x(5)=abs(x(1)) 结果
x =
-1.3000 1.7321 4.8000 0 1.3000
注:结果中自动产生了向量的第5个元素,中间未定义的元素自动初始为零. 大的矩阵可把小的矩阵作为其元素来完成,如:
A=[A; [10 11 12]] 结果
A =
1 2 3 4 5 6 7 8 0 10 11 12
小矩阵可用“:”从大矩阵中抽取出来,如:
A=A(1:3,:);
即从A中取前三行和所有的列,重新组成原来的A. (详细介绍参见第二节的相关内容) §1.2.3语句和变量
Matlab的表述语句、变量的类型说明由Matlab系统解释和判断.Matlab语句通常形式为:
变量=表达式
或者使用其简单形式为: 表达式
表达式由操作符或其它特殊字符、函数和变量名组成.表达式的结果为一个矩阵,显示
6
在屏幕上,同时保存在变量中以留用.如果变量名和“=”省略,则具有ans名(意思指回答)的变量将自动建立.例如:
键入1900/81 结果为:
ans =
23.4568
需注意的问题有以下几点:
? 语句结束键入回车键,若语句的最后一个字符是分号,即“;”,则表明不输出当前
命令的结果.
? 如果表达式很长,一行放不下,可以键入“…”(三个点,但前面必须有个空格,
目的是避免将形如“数2 …”理解为“数2.”与“..”的连接,从而导致错误),然后回车.
? 变量和函数名由字母加数字组成,但最多不能超过63个字符,否则系统只承认前
63个字符.
? Matlab变量字母区分大小写,如A和a不是同一个变量,函数名一般使用小写字
母,如inv(A)不能写成INV(A),否则系统认为未定义函数. §1.2.4 who和系统预定义变量
输入who命令可检查工作空间中建立的变量,键入:
who
系统输出为:
Your variables are:
A ans x
这里表明三个变量已由前面的例子产生了.
但列表中列出的并不是系统全部的变量,系统还有以下内部变量: eps、pi、Inf、NaN
变量eps在决定诸如矩阵的奇异性时,可作为一个容许差,容许差的初值为1.0到1.0以后计算机所能表示的下一个最大浮点数,IEEE在各种计算机、工作站和个人计算机上使用这个算法.用户可将此值置为任何其它值(包括0值).Matlab的内部函数pinc和rank以eps为缺省的容许差.
变量pi是?,它是用imag(log(-1))建立的. Inf表示无穷大.如果您想计算1/0
S=1/0 结果会是
Warning:Divide by zero
S=Inf
具有IEEE规则的机器,被零除后,并不引出出错条件或终止程序的运行,而产生一个警告信息和一个特殊值在计算方程中列出来.
变量NaN表示它是个不定值.由Inf/Inf或0/0运算产生. 要了解当前变量的信息请键入whos,屏幕将显示:
Name Size Bytes Class A 4x3 96 double array S 1x1 8 double array ans 1x1 8 double array x 1x5 40 double array Grand total is 19 elements using 152 bytes
从size及bytes项目可以看出,每一个矩阵实元素需8个字节的内存.4×3的矩阵使用96个字节,全部变量的使用内存总数为152个字节.自由空间的大小决定了系统变量的多少,如计算机上有虚拟内存的话,其可定义的变量个数会大大增加. §1.2.5数和算术表达式
Matlab中数的表示方法和一般的编程语言没有区别.如:
7
3 -99 0.0001 9.63972 1.6021E-20 6.02252e23
在计算中使用IEEE浮点算法其舍入误差是eps.浮点数表示范围是10-308~10308. 数学运算符有:
+ 加 - 减 * 乘 / 右除 \\ 左除 ^ 幂
这里1/4和4\\1有相同的值都等于0.25(注意比较:1\\4=4).只有在矩阵的除法时左除和右除才有区别.
§1.2.6复数与矩阵
在Matlab中输入复数首先应该建立复数单位:
i=sqrt(-1) 及j=sqrt(-1)
之后复数可由下面语句给出:
Z=3+4i (注意: 在4与i之间不要留有任何空间!) 输入复数矩阵有两个方便的方法,如:
A=[1 2; 3 4] + i*[5 6; 7 8] 和 A=[1+5i 2+6i; 3+7i 4+8i]
两式具有相等的结果.但当复数作为矩阵的元素输入时,不要留有任何空间,如1+5i,如在“+”号左右留有空格,就会被认为是两个分开的数.
不过实际使用复数时并没有这么麻烦,系统有一个名为startup.m的Matlab命令文件,建立复数单位的语句也放在其中.当Matlab启动时,此文件自动执行,i和j将自动建立. §1.2.7输出格式
任何Matlab语句执行结果都可在屏幕上显示,同时赋给指定的变量,没有指定变量时赋给ans.数字显示格式可由format命令来控制(Windows系统下的Matlab系统的数字显示格式可以由Option菜单中的Numerical Format菜单改变).format仅影响矩阵的显示,不影响矩阵的计算与存贮.(Matlab以双精度执行所有的运算)
首先,如果矩阵元素是整数则矩阵显示就没有小数,如x=[-1 0 1],结果为: x= -1 0 1
如果矩阵元素不是整数则输出形式有:(用命令:format 格式进行切换) 格式 中文解释 说明 format Default. Same as SHORT 短格式 (缺省格式) format short Scaled fixed point format with 5 digits 短格式 (只显示五位十进制数) (缺省格式) format long Scaled fixed point format with 15 digits 长格式 format short e Floating point format with 5 digits 短格式e方式 format long e Floating point format with 15 digits 长格式e方式 format short g Best of fixed or floating point format with 5 digits 短格式g方式 format long g Best of fixed or floating point format with 15 digits 长格式g方式 format hex Hexadecimal format 16进制格式 format + The symbols +, - and blank are printed +格式 for positive, negative and zero elements. Imaginary parts are ignored format bank Fixed format for dollars and cents 银行格式
8
format rat format compact format loose 例如: 有理数格式 压缩格式 自由格式 Approximation by ratio of small integers Suppress extra line-feeds Puts the extra line-feeds back in x=[4/3 1.2345e-6]
在不同的输出格式下的结果为: 短格式 1.3333 0.0000 短格式e方式 1.3333e+000 1.234e-006 长格式 1.333333333333333 0.000001234500000 长格式e方式 1.333333333333333e-000 1.23450000000000e-006 有理数格式 4/3 1/810045 16进制格式 3ff5555555555555 3eb4b6231abfd271 +格式 + +
对于短格式,如果矩阵的最大元素比数999999999大,或者比数0.0001小,则在打印时,将加入一个普通的长度因数.如y=1.e20*x,意为x被1020乘,结果为:
y= 1.0e+020*
1.3333 0.0000
“+”格式是显示大矩阵的一种紧凑方法,“+”,“-”和空格显示正数、负数和零元素. 最后format compact命令压缩显示的矩阵,以允许更多的信息显示在屏幕上. §1.2.8 Help求助命令和联机帮助
Help求助命令很有用,它对Matlab大部分命令提供了联机求助信息.您可以从Help菜单中选择相应的菜单,打开求助信息窗口查询某条命令,也可以直接用help命令.
键入help
得到help列表文件,键入“help 指定项目”,如:
键入help eig
则提供特征值函数的使用信息.
键入help [
显示如何使用方括号等.
键入help help
显示如何利用help本身的功能.
还有,键入lookfor <关键字>:可以从m文件的help中查找有关的关键字. §1.2.9 退出和存入工作空间
退出Matlab可键入quit或exit或选择相应的菜单.中止Matlab运行会引起工作空间中变量的丢失,因此在退出前,应键入save命令,保存工作空间中的变量以便以后使用.
键入 save
则将所有变量作为文件存入磁盘Matlab.mat中,下次Matlab启动时,
键入load
将变量从Matlab.mat中重新调出.
save和load后边可以跟文件名或指定的变量名,如仅有save时,则只能存入Matlab.mat中.如save temp命令,则将当前系统中的变量存入temp.mat中去,命令格式为:
save temp x 仅仅存入x变量.
save temp X Y Z 则存入X、Y、Z变量.
load temp可重新从temp.mat文件中提出变量,load也可读ASCII数据文件.详细语法见联机帮助.
第二节 向量与矩阵运算
Matlab能处理数、向量和矩阵.但一个数事实上是一个1×1的矩阵,1个n维向量也
9
特殊的用途加进去的.其它功能函数在求助程序或命令手册中都可找到.手册中备有为Matlab提供数学基础的LINPACK和EISPACK软件包,提供了下面四种情况的分解函数或变换函数:
(1)三角分解;(2)正交变换;(3) 特征值变换;(4)奇异值分解. §3.7.1三角分解
最基本的分解为“LU”分解,矩阵分解为两个基本三角矩阵形成的方阵,三角矩阵有上三角矩阵和下三角矩阵.计算算法用高斯变量消去法.
从lu函数中可以得到分解出的上三角与下三角矩阵,函数inv得到矩阵的逆矩阵,det得到矩阵的行列式.解线性方程组的结果由方阵的“\\”和“/”矩阵除法来得到.
例如:
A=[ 1 2 3
4 5 6 7 8 0]
LU分解,用Matlab的多重赋值语句
[L,U]=lu(A) 得出
L = 0.1429 1.0000 0 0.5714 0.5000 1.0000 1.0000 0 0 U = 7.0000 8.0000 0 0 0.8571 3.0000 0 0 4.5000 注:L是下三角矩阵的置换,U是上三角矩阵的正交变换,分解作如下运算,检测计算结果只需计算L*U即可.
求逆由下式给出: x=inv(A)
x =
-1.7778 0.8889 -0.1111 1.5556 -0.7778 0.2222 -0.1111 0.2222 -0.1111 从LU分解得到的行列式的值是精确的,d=det(U)*det(L)的值可由下式给出:
d=det(A) d =
27
直接由三角分解计算行列式:d=det(L)*det(U)
d =
27.0000
为什么两种d的显示格式不一样呢? 当Matlab做det(A)运算时,所有A的元素都是整数,所以结果为整数.但是用LU分解计算d时,L、U的元素是实数,所以Matlab产生的d也是实数.
例如:线性联立方程取 b=[ 1 3 5]
解Ax=b方程,用Matlab矩阵除得到
x=A\\b 结果x=
0.3333 0.3333 0.0000
由于A=L*U,所以x也可以有以下两个式子计算:y=L\\b,x=U\\y.得到相同的x值,中间值y为:
15
y =
5.0000 0.2857 0.0000
Matlab中与此相关的函数还有rcond、chol和rref.其基本算法与LU分解密切相关.chol函数对正定矩阵进行Cholesky分解,产生一个上三角矩阵,以使R'*R=X.rref用具有部分主元的高斯-约当消去法产生矩阵A的化简梯形形式.虽然计算量很少,但它是很有趣的理论线性代数.为了教学的要求,也包括在Matlab中.
§3.7.2正交变换
“QR”分解用于矩阵的正交-三角分解.它将矩阵分解为实正交矩阵或复酉矩阵与上三角矩阵的积,对方阵和长方阵都很有用.
例如A=[ 1 2 3
4 5 6 7 8 9 10 11 12]
是一个降秩矩阵,中间列是其它二列的平均,我们对它进行QR分解:
[Q,R]=qr(A) Q = -0.0776 -0.8331 0.5444 0.0605 -0.3105 -0.4512 -0.7709 0.3251 -0.5433 -0.0694 -0.0913 -0.8317 -0.7762 0.3124 0.3178 0.4461 R = -12.8841 -14.5916 -16.2992 0 -1.0413 -2.0826 0 0 0.0000 0 0 0 可以验证Q*R就是原来的A矩阵.由R的下三角都给出0,并且R(3,3)=0.0000,说明矩阵R与原来矩阵A都不是满秩的.
下面尝试利用QR分解来求超定和降秩的线性方程组的解. 例如:
b=[ 1
3 5 7]
讨论线性方程组Ax=b,我们可以知道方程组是超定的,采用最小二乘法的最好结果是计算x=A\\b.
结果为:
Warning: Rank deficient, rank = 2 tol = 1.4594e-014 x =
0.5000 0 0.1667
我们得到了缺秩的警告.用QR分解法计算此方程组分二个步骤:
y=Q'*b x=R\\y 求出的y值为
y = -9.1586 -0.3471 0.0000
16
0.0000 x的结果为 Warning: Rank deficient, rank = 2 tol = 1.4594e-014 x =
0.5000 0 0.1667
用A*x来验证计算结果,我们会发现在允许的误差范围内结果等于b.这告诉我们虽然联立方程Ax=b是超定和降秩的,但两种求解方法的结果是一致的.显然x向量的解有无穷多个,而“QR”分解仅仅找出了其中之一.
§3.7.3奇异值分解
在Matlab中三重赋值语句
[U,S,V]=svd(A)
在奇异值分解中产生三个因数:
A=U*S*V '
U矩阵和V矩阵是正交矩阵,S矩阵是对角矩阵,svd(A)函数恰好返回S的对角元素,而且就是A的奇异值(其定义为:矩阵A'*A的特征值的算术平方根).注意到A矩阵可以不是方的矩阵.
奇异值分解可被其它几种函数使用,包括广义逆矩阵pinv(A)、秩rank(A)、欧几里德矩阵范数norm(A,2)和条件数cond(A).
§3.7.4 特征值分解
如果A是n×n矩阵,若?满足Ax=?x,则称?为A的特征值,x为相应的特征向量. 函数eig(A)返回特征值列向量,如果A是实对称的,特征值为实数.特征值也可能为复数,例如:
A=[ 0 1
-1 0] eig(A) 产生结果 ans =
0 + 1.0000i 0 - 1.0000i
如果还要求求出特征向量,则可以用eig(A)函数的第二个返回值得到:
[x,D]=eig(A)
D的对角元素是特征值.x的列是相应的特征向量,以使A*x=x*D. 计算特征值的中间结果有两种形式:
Hessenberg形式为hess(A),Schur形式为schur(A).
schur形式用来计算矩阵的超越函数,诸如sqrtm(A)和logm(A).
如果A和B是方阵,函数eig(A,B)返回一个包含一般特征值的向量来解方程
Ax=?Bx
双赋值获得特征向量
[X,D]=eig(A,B)
产生特征值为对角矩阵D.满秩矩阵X的列相应于特征向量,使A*X=B*X*D,中间结果由qz(A,B)提供.
§3.7.5秩
Matlab计算矩阵A的秩的函数为rank(A),与秩的计算相关的函数还有:rref(A)、orth(A)、null(A)和广义逆矩阵pinv(A)等.
利用rref(A),A的秩为非0行的个数.rref方法是几个定秩算法中最快的一个,但结果上并不可靠和完善.pinv(A)是基于奇异值的算法.该算法消耗时间多,但比较可靠.其它函数的详细用法可利用Help求助.
17
第四节 Matlab中的图形
§4.1 二维作图
绘图命令plot绘制x-y坐标图;loglog命令绘制对数坐标图;semilogx和semilogy命令绘制半对数坐标图;polor命令绘制极坐标图.
§4.1.1 基本形式
如果y是一个向量,那么plot(y)绘制一个y中元素的线性图.假设我们希望画出 y=[0., 0.48, 0.84, 1., 0.91, 6.14 ] 则用命令:plot(y)
它相当于命令:plot(x, y),其中x=[1,2,…,n]或x=[1;2;…;n],即向量y的下标编号, n为向量y的长度
Matlab会产生一个图形窗口,显示如下图形,请注意:坐标x和y 是由计算机自动绘出的.
76543210123456图4.1.1.1 plot([0.,0.48,0.84,1.,0.91,6.14])
上面的图形没有加上x轴和y轴的标注,也没有标题.用xlabel,ylabel,title命令可以加上.
如果x,y是同样长度的向量,plot(x,y)命令可画出相应的x元素与y元素的x-y坐标图.例:
x=0:0.05:4*pi; y=sin(x); plot(x,y) grid on, title(' y=sin( x ) 曲线图' ) xlabel(' x = 0 : 0.05 : 4Pi ') 结果见下图.
y=sin( x ) 曲线图10.80.60.40.20-0.2-0.4-0.6-0.8-102468101214 x = 0 : 0.05 : 4Pi 图4.1.1.2 y=sin(x)的图形
18
title xlabel ylabel text grid hold 图形标题 x坐标轴标注 y坐标轴标注 标注数据点 给图形加上网格 保持图形窗口的图形 表4.1.1.1 Matlab图形命令 §4.1.2 多重线
在一个单线图上,绘制多重线有三种办法. 第一种方法是利用plot的多变量方式绘制:
plot(x1,y1,x2,y2,...,xn,yn)
x1,y1,x2,y2,...,xn,yn是成对的向量,每一对x, y在图上产生如上方式的单线.多变量方式绘图是允许不同长度的向量显示在同一图形上.
第二种方法也是利用plot绘制,但加上hold on/off命令的配合:
plot(x1,y1) hold on plot(x2,y2) hold off
第三种方法还是利用plot绘制,但代入矩阵:
如果plot用于两个变量plot(x,y),并且x,y是矩阵,则有以下情况:
(1)如果y是矩阵,x是向量,plot(x,y)用不同的画线形式绘出y的行或列及相应的x向量,y的行或列的方向与x向量元素的值选择是相同的.
(2)如果x是矩阵,y是向量,则除了x向量的线族及相应的y向量外,以上的规则也适用.
(3)如果x,y是同样大小的矩阵,plot(x,y)绘制x的列及y相应的列. 还有其它一些情况,请参见Matlab的帮助系统. §4.1.3 线型和颜色的控制
如果不指定划线方式和颜色,Matlab会自动为您选择点的表示方式及颜色.您也可以用不同的符号指定不同的曲线绘制方式.例如:
plot(x,y,'*') 用'*'作为点绘制的图形.
plot(x1,y1,':',x2,y2,'+') 用':'画第一条线,用'+'画第二条线. 线型、点标记和颜色的取值有以下几种: 线型 点标记 颜色 - . y 实线 点 黄 : o m 虚线 小圆圈 棕色 -. x c 点划线 叉子符 青色 -- + r 间断线 加号 红色 * g 星号 绿色 s b 方格 蓝色 d w 菱形 白色 ^ k 朝上三角 黑色 v 朝下三角 > 朝右三角 < 朝左三角 p 五角星 h 六角星 表4.1.3.1线型和颜色控制符 如果你的计算机系统不支持彩色显示,Matlab将把颜色符号解释为线型符号,用不同
的线型表示不同的颜色.颜色与线型也可以一起给出,即同时指定曲线的颜色和线型.
19
9.假如你有一组实测数据,例如:
x=[53 56 60 67.5 75 90 110]; y=[109 120.5 130 141.1 157.5 180 185]; 求其回归直线,画回归直线图形并计算最小误差平方和. 10.假如你有一组实测数据,例如:
x=[75 86 95 108 112 116 135 151 155 160 163 167 171 178 185]; y=[10 12 15 17 20 22 35 41 48 50 51 54 59 66 75]; 求其回归直线,画回归直线图形并计算最小误差平方和.
11.随机产生500个0到100的整数FS作为学生的考试分数.
(1) 画出FS的简单直方图;
(2) 画出每个分数段(0~10、10~20、?,90~100)的统计频数直方图; 12.求下列各结果:
(1)用Matlab因式分解:x100?1.
(1?x)?e.
x1x(2)用Matlab求极限:L?lim(3)用Matlab求积分:
x?0?0??sinx2dx.
n?1(4)用Matlab求幂级数:
?(?1)n?1?x2n?14n?12的和函数(化简结果).
13.非线性回归尝试
下表是到1994年的游泳世界纪录,试估计时间y与距离x的关系. 50 100 200 400 800 1500 距离x(米) 21.81 48.42 106.69 225 466.60 863.48 时间y(秒) 说明:用线性回归方法将得到:y??11.0089?0.5961x,但当x?18时,y??0.2794,这是非常荒唐的结果!显然,一个基本要求是当x?0时y?0.试尝试使用非线性回归模型: y?ax.
14. (三维)符号作图尝试 命令 作用 解释 ezplot3 3-D parametric curve plotter 3D参数曲线图形 ezcontour use contour plotter 等高线图 ezcontourf filled contour plotter 填充等高线图 ezmesh 3-D mesh plotter 3D mesh曲面图形 ezmeshc combination mesh/contour plotter mesh曲面/等高线图 ezsurf 3-D colored surface plotter 3D surf曲面图形 ezsurfc combination surf/contour plotter surf曲面/等高线图 请尝试以下的命令:
ezplot3('sin(t)', ' cos(t)', 't', [0,6*pi]) ezcontour('x*exp(-x^2 - y^2)') ezcontourf('x*exp(-x^2 - y^2)')
ezmesh('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi]) ezmeshc('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi]) ezsurf('x*exp(-x^2 - y^2)') ezsurfc('x*exp(-x^2 - y^2)')
b 40
为“1”.因此下列两种表示:
p | (~p) 结果为1. p & (~p) 结果为0.
any和all函数在连接操作时很有用,设x是0-1向量,如果x中任意有一元素非零时,any(x)返回“1”,否则返回“0”;all(x)函数当x的所有元素非零时,返回“1”,否则也返回“0”.这些函数在if语句中经常被用到.如:
if all(A<5)
do something end
§5.2控制流
Matlab与其它计算机语言一样,也有控制流语句.控制流语句可使原本简单地在命令行中运行的一系列命令或函数,组合成为一个整体——程序,从而提高工作效率. §5.2.1 for 循环
Matlab与其它计算机语言一样有do或for循环,完成一个语句或一组语句在一定时间内反复运行的功能.例如:
for i = 1:n , x( i )=0, end
x的第一个元素赋0值,如果n<1,结构上合法,但内部语句不运行,如果x不存在或比n元素小,额外的空间将会自动分配.
多重循环写成锯齿形是为了增加可读性.例如: m=9;n=9; for i = 1:m
for j=1:n A( i, j ) = 1/( i + j - 1);
end end A
程序的说明:
(1)事实上,上述程序给出了Hilbert矩阵的构造过程,可参见函数hilb(n). (2)语句内部使用分号,表示计算过程不输出中间结果. (3)循环后的A命令表示显示矩阵A的结果.
(4)每个for语句必须以end语句结束,否则是错误的. for循环的通用形式为:
for v=expression
statements end
其中expression表达式是一个矩阵,因为Matlab中都是矩阵,矩阵的列被一个接一个的赋值到变量v,然后statements语句运行.
通常expression是一些m:n或m:k:n仅有一行的矩阵,并且它的列是个简单的标量.但如注意到expression可以为矩阵,即v可以为向量,对某些问题的处理将大大简化. §5.2.2 while 循环
Matlab中的while 循环语句为一个语句或一组语句在一个逻辑条件的控制下重复未知的次数.
它的一般形式为:
while expression
statements end
当expression的所有运算为非零值时,statements语句组将被执行.如果判断条件是向量或矩阵的话,可能需要all或any函数作为判断条件.
例如计算expm(A),在A并不是太大时,直接计算expm(A)是可行的.
30
expm(A)=I+A+A^2/2!+A^3/3!+? 注意:这里的I表示单位矩阵. 程序为:
E = 0*A; F = E + eye(size(E)); N = 1; while norm(F,1) > 0,
F = A*F/N; E = E + F; N = N + 1; end
§5.2.3 if和break语句
下面介绍if语句的二个例子.
(1) 一个计算如何被分成三个部分,用符号校验:
if n<0
A=negative(n) elseif mod(n,2)==0
A=even(n) else
A=odd(n) end
其中的三个函数negative(n)、even(n)、odd(n)是自编的输出函数.参见下面的函数文件.
(2) 这个例子涉及数论中一个很有趣的问题,取任何的正整数,如果是偶数,用2除;如果是奇数,用3乘,并加上1,反复这个过程,直到你的整数成为1.这个极有趣不可解的问题是:有使这个过程不中止的整数吗?
%classic \while 1
n=input('Enter n, negative quits: '); if n<=0 break,end while n>1 if rem(n,2) == 0 %% 是连续的2个等号 n=n/2 else n=3*n+1 end; end end
这个过程能永远进行吗? 程序的说明:
(1)本程序用到了if语句与while语句,过程比较复杂;
(2)使用input函数,可使程序在执行过程中,从键盘输入一个数(矩阵); (3)break语句提供了程序跳出死循环的途径.
§5.3 M文件、命令文件及函数文件
§5.3.1 M文件
Matlab通常使用命令驱动方式,当单行命令输入时,Matlab立即处理并显示结果,同时将运行说明或命令存入文件.
Matlab语句的磁盘文件称作M文件,因为这些文件名的未尾是.M形式,例如一个文件名为bessel.m,提供bessel函数语句.
一个M文件包含一系列的Matlab语句,一个M文件可以循环地调用它自己. M文件有两种类型:
第一类型的M文件称为命令文件,它是一系列命令、语句的简单组合.
31
第二类型的M文件称为函数文件,它提供了Matlab的外部函数.用户为解决一个特定问题而编写的大量的外部函数可放在Matlab工具箱中,这样的一组外部函数形成一个专用的软件包.
这两种形式的M文件,无论是命令文件,还是函数文件,都是普通的ASCII文本文件,可选择编辑或字处理文件来建立.
§5.3.2命令文件
当一个命令文件被调用时,Matlab运行文件中出现的命令而不是交互地等待键盘输入,命令文件的语句在工作空间中运算全局数据,对于进行分析解决问题及做设计中所需的一长串繁杂的命令和解释是很有用的.
例如:一个自编的命令文件fibo.m,用于计算Fibonnaci数列
% An M-file to calculate Fibonnaci numbers f=[1, 1 ]; i = 1;
while f(i)+f(i+1)<1000
f(i+2)=f(i)+f(i+1); i=i+1; end plot(f)
在Matlab命令窗口中键入fibo命令,并回车执行,将计算出所有小于1000的Fibonnaci数,并绘出图形.
要注意的是:文件执行后,f和i变量仍然留在工作空间. §5.3.3函数文件
如果M文件的第一行包含function,这个文件就是函数文件,它与命令文件不同,所定义变量和运算都在文件内部,而不在工作空间.函数被调用完毕后,所定义变量和运算将全部释放.函数文件对扩展Matlab函数非常有用.
例如:一个自编的函数文件mean.m,用于求向量的(或矩阵按列的)平均值
function y=mean(x)
% MEAN Average or mean value,For Vectors, % MEAN (x) returns the mean value % For matrix MEAN (x) is a row vector % containing the mean value of each column [m,n]=size(x); if m==1
m=n; end
y=sum(x)/m;
磁盘文件中定义的新函数称为mean函数,它与Matlab函数一样使用,例如z为从1到99的实数向量:
z=1:99;
计算均值:mean(z)
ans=
50
mean.m程序的说明:
(1)第一行的内容:函数名,输入变量,输出变量,没有这行这个文件就是命令文件,而不是函数文件.
(2)%:表明%右边的行是说明性的内容注释.前一小部分行来确定M文件的注释,并在键入help mean后显示出来.显示内容为连续的若干个%右边的文字.
(3)变量m,n和y是mean的局部变量,在mean运行结束后,它们将不在工作空间z中存在.如果在调用函数之前有同名变量,先前存在的变量及其当前值将不会改变.
再例如:一个计算标准差的函数文件stat.m
function [mean,stdev]=stat(x)
32
[m,n]=size(x); if m==1
m=n end
mean=sum(x)/m;
stdev=sqrt(sum(x.^2)/m-mean.^2); stat表明返回多输出变量是可能的.
又如:使用多输入变量计算矩阵秩函数
function r=rank(x,tol) % rank of a matrix s=svd(x); if(nargin==1)
tol=max(size(x))*s(1)*eps; end
r=sum(s>tol);
这个变量说明利用永久变量nargin确定输入变量的个数,变量nargout虽然这里没有使用,但它包含有输出变量的个数.
一些有用的说明:
当M函数文件第一次在Matlab运行时,它被编译并放入内存,以后使用时不用重新编译即可得到.
what命令:显示磁盘当前目录中的M文件, dir命令:列出所有文件.
一般而言,输入一个名字到Matlab,例如键入whoopie命令,Matlab用以下步骤解释: (1) 看whoopie是否为变量.
(2) 检验whoopie是否为在线函数. (3) 检验whoopie文件的当前目录.
(4) 将whoopie看成Matlab的PATH中的一个文件,在Matlab PATH目录中搜索. 如果whoopie存在,Matlab首先将其作为变量而不是作为函数.
§5.4 字符串、输入及输出
§5.4.1 echo、input、pause、keyboard
一般来说,当一个M文件运行时,文件的命令不在屏幕上显示,而echo命令则使M文件运行时,命令在屏幕上显示,这对于调试、演示相当有用.
input功能:输入Input('How many apples')给用户一个提示串,等待,然后显示用户通过键盘输入的大量表达式.可以用input命令建立驱动M文件的菜单.
与input功能相同,但功能更强的keyboard命令将计算机作为一个命令文件来调用,放入M文件中,此特性对调试或正在运行期间修改变量很有用.
pause命令:使用户暂停运行一个程序,当再按任一键时恢复执行,pause(n)等待n秒钟后再继续执行.
§5.4.2串和宏串
字符串用单个引号输入到Matlab中,例如:
s='Hello' 结果显示为:
s =
Hello
字符存在向量中,每个元素就是一个字符,如:
size(s) ans =
1 5
33
表明S为一个1×5的矩阵,有五个元素.字符以ASCII值存入,abs函数或double函数将显示以下值(即Hello的ASCII值)
abs(s) ans =
72 101 108 108 111
getstr函数,使向量作为字符显示,而不显示ASCII值.
disp可在变量中显示字符.sprintf, num2str和int2str可以将数字转换成串. 字符变量通过括号连成大串.例如: s='hello'; s=[s,' world'] s =
hello world
eval是与字符变量—起工作的函数,执行简单字符宏调用.eval( t )执行包含在t内的字符.如果t是任何Matlab表达式或语句的源字符,则字符串被解释执行.例如:
t='eye(2)', eval(t) 结果为:
ans=
1 0 0 1
又例如,给矩阵元素赋值
t='1/(i+j-1)'; for i=1:n
for j=1:n a( i, j)=eval(t);
end end
这儿有一个例子,介绍如何一起使用eval与load命令,装入十个具有顺序文件名的文件中的数据:
fname='mydata'; for i = 1:10
eval([ 'load ', fname, int2str( i )]) end §5.4.3外部程序
Matlab与外部独立程序的通讯方式可以是多种多样的,下面介绍其中的一个办法: (1) Matlab中将变量存入磁盘
(2) 运行外部程序(读数据文件,进行处理),将结果写到磁盘上 (3) 将处理后的文件装回到工作空间中
例如:用外部程序gareqn找garfield方程的结果:
function y=garfield(a,b,q,r) save gardata a,b,q,r ! gareqn load gardata
使用FORTRAN或其它语言写gareqn程序,使其可以读gardata.mat,进行处理,将结果存入文件中.
这个程序可将计算机的“连接码”提供给Matlab,在许多系统中它将新的目标码连接到程序中比物理联接要方便得多.
§5.4.4输入输出数据
可使用各种方法将其它程序和外部世界的数据送入Matlab,同样可把Matlab数据输送到外部世界,使你的程序以Matlab使用的文件形式直接计算数据.
最好的方法取决于多少数据,数据是否可读,什么形式等: (1) 清晰的元素表输入:
34
正在阅读:
Matlab基础入门教程09-09
法语综合教程1第12课后题答案09-25
混凝土配合比快速自动计算表06-12
预备党员思想汇报范文2022年07-31
软件测试项目计划书01-11
辅导员技能大赛-案例分析报告汇总情况10-02
个人现实表现材料德能勤绩廉04-02
学术研究理论12-25
西方法律思想史笔记05-14
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 入门教程
- 基础
- Matlab
- 2019年高考物理一轮复习第八章恒定电流45分钟章末验收卷
- 白银投资有哪些渠道 每个渠道分别有哪些特点?
- 中储式制粉系统优化
- 关于高考制度
- 化学辽宁省实验中学等五校2014-2015学年高二下学期期末考试化学试题分解
- 集装箱出口流程
- 教师工作检讨书
- 生物系统学练习卷(一)
- 油罐车的接地线的作用
- 中学一级教师
- 2012-2013学年度第一学期经济政治与社会期末考试
- 平安基础性向测试智商测试题与答案
- 廉租房租赁合同
- 海航同仁守则
- CMDB的一些记录
- 第六次团学代表大会资料 - 图文
- 教师依法执教与学生管理的法治化
- 矿体圈定与资源储量估算
- 2014年会计从业考试《会计电算化》考点:应收处理每日一练(11月2日)
- 托物言志作文600字10篇满分范文