MATLAB语言基础攻略_第1页
MATLAB语言基础攻略_第2页
MATLAB语言基础攻略_第3页
MATLAB语言基础攻略_第4页
MATLAB语言基础攻略_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB语言基础广东工业大学自动化学院李明系统仿真与MATLAB引言形而上者谓之道,形而下者谓之器

——《易经·系辞》所谓“道”者,是指从具体实践活动中总结、提取概括出来的具有普适性的规律⇒

认识世界所谓“器”者,则是在特定规律下制造出来的用于某种目的的工具⇒

改造世界控制系统设计→道MATLAB→器MATLAB初识MATLAB为何

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB是矩阵实验室(MatrixLaboratory)的简称,和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。

MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。

MATLAB何用MATLAB产品族主要应用于工程计算与科学绘图控制系统的分析与设计

数字图像处理数字信号处理通讯系统设计财务与金融工程附加的工具箱(单独提供的专用MATLAB函数集)扩展了MATLAB环境,以解决这些应用领域内的问题MATLAB的产生与发展产生MATLAB诞生于20世纪70年代,其首创者是时任新墨西哥大学教授Cleve

Moler及其同事,他们意识到在讲述诸如线性代数等课程时,已有的编程语言比如Fortran和C语言已经不能满足需求,为了降低编程方面的负担,CleveMoler基于他自己使用Fortran语言编写的用于求解线性方程的子程序库——基于特征计算的程序库EISPACK和线性代数程序库LINPACK,开发了MATLAB的雏形发展MATLAB是集命令翻译、科学计算于一身的一套交互式软件系统,最初作为免费软件在大学里广泛使用,功能也比较简单,只能进行矩阵运算和简单的绘图,但是因为在MATLAB中矩阵运算变得异常简单,不需要用其他高级语言编写矩阵运算程序库,因而受到广大工程专业大学生的青睐,也正是因为在控制分析和信号处理等工程领域中非常强调矩阵的运算和分析,才促使CleveMoler对MATLAB进行继续开发,并于1984年与JackLittle等一起创办了MathWorks公司,把MATLAB推向市场。自公司开创以来,MathWorks不断致力于版本的更新和软件各方面功能的增强历经多年的发展,MATLAB长于数值计算,能处理大量的数据,而且效率比较高。MathWork公司在此基础上加强了MATLAB的符号计算、文字处理、可视化建模和实时控制能力,增强了MATLAB的市场竞争力,使MATLAB成为了市场主流的数值计算软件。到20世纪90年代,MATLAB已成为国际控制界的标准计算软件。MATLAB的优势强大易用的科学计算语言MATLAB之所以能迅速发展的一个重要原因就是MATLAB的使用简洁直观,符合人们的思维习惯,易于理解和学习。矩阵运算,例如矩阵乘积,矩阵求逆等等;用C则比较复杂求线性代数方程Ax=b的解,x=A\b针对许多专门的领域,将工程科学界重要的问题通过软件制作成工具箱全面的图形功能一般数据可视化软件的功能,例如二维图形和三维图形的可视化、图像处理、动画和表达式作图等添加了软件独有的图形的光照处理、色度处理以及四维数据的表现等图形用户界面(GUI)的制作上作了很大的改善独立开放的平台和实用的程序接口支持多种计算机操作系统,提供了大量的平台独立的措施利于平台之间移植MATLAB和Fortran、C和Basic之间都可以方便的实现连接强大的动态系统仿真功能MATLAB界面MATLAB窗口(1)命令窗口(CommandWindow)三个蓝色的入门链接“>>”为命令提示符,此时我们可以在>>之后输入一些基本命令,例如数值运算命令,然后按下Enter键,MATLAB则会在命令窗口立即显示结果,并将结果自动赋予变量名ansMATLAB允许一行输入多个命令,此时可以用逗号“,”和分号“;”来实现,区别在于使用逗号时将会显示运行结果,使用分号时运行结果将予以隐藏>>3.14*3^2 %采用直接演算法,类似于计算器ans=28.2600>>r=3 %采用变量赋值的方法,圆的半径r=3r=3>>S=3.14*r^2 %求圆的面积SS=28.2600>>r=3;S=3.14*r^2 %使用分号禁止显示计算的中间结果S=28.2600

MATLAB窗口(2)历史命令窗口(CommandHistory)历史命令窗口用于记录用户在命令窗口执行过的命令行。包括已运行过的命令、函数、表达式、使用时间等信息。在历史命令窗口的命令是按逆序排列的。即最早的命令在排在最下面,最后的命令排在最上面。在历史命令窗口可进行命令历史的查找、检查等工作。用鼠标选中历史命令窗口中的命令行,单击右键弹出操作菜单,我们可以选择相应菜单项对这些历史命令进行各种操作如:复制(Copy)执行(Evaluateselection)删除(Deleteselection)双击(Doubleclick)这些命令可使它再次执行。MATLAB窗口(3)工作间管理窗口(Workspace)工作空间是用于储存运算中的各种变量和结果的内存空间,而工作空间窗口则用于显示变量的名称、大小、字节数及数据类型等;我们可以通过工作空间窗口对变量进行观察、编辑、保存和删除等操作,有命令行和变量编辑器(VariableEditor)两种方式工作空间管理窗口中命令行方式的主要命令命令功能who显示存储在工作空间全部变量的名称whos显示存储在工作空间全部变量的名称、大小、数据类型等详细信息clear从工作空间中清除变量和函数save保存工作空间变量load从磁盘文件中读取变量到工作空间lengthlength(A),若A向量则显示其长度,若A为矩阵则显示行数与列数中的较大数sizesize(A),得到矩阵A的行数和列数disp显示变量MATLAB窗口(4)当前路径窗口(CurrentDirectory)MATLAB的当前目录窗口(CurrentDirectory)用于显示及设置当前工作目录,同时显示当前工作目录下的文件名、文件类型及目录的修改时间等信息。用鼠标选中文件,单击右键可以进行打开(Open)、运行(RunFile)、重命名(Rename)、删除(Delete)等操作,只有在当前目录或搜索路径下的文件及函数才可以被MATLAB运行或调用。设置当前目录可以在当前目录窗口上方的输入栏中直接输入,或点击浏览器下拉按钮进行选择。MATLAB的路径搜索什么是搜索路径专门用于查找“.m”文件的路径搜索器,为一系列文件路径的组合,缺省状态下包括当前路径和已安装的全部工具箱的路径。如果调用的函数或文件在搜索路径之外,MATLAB会认为此函数或文件不存在而返回错误信息。一般而言,当在命令窗口输入一个字符串时,MATLAB按下列顺序开始搜索:在工作空间中搜索是否有以该字符串为变量名的变量,有则返回该变量的值;搜索是否有同名的MATLAB内部函数,若有,执行该内部函数;在当前目录中查找与该字符串同名的M文件,若有,执行该文件;在搜索目录中查找与该字符串同名的M文件,若有,执行该文件;如果在搜索目录中存在多个同名函数,则只执行搜索路径中的第一个函数,其他函数不再执行。MATLAB的路径搜索搜索路径>>path (列出所有搜索路径)>>editpath (进入搜索路径对话框)>>pathtool (进入搜索路径对话框)对话框中的设置方法用AddFolder…按钮可以将某一目录加入搜索路径而忽略其子目录,选择AddwithSubfolder…按钮可将选中目录的子目录也包括在搜索路径中,一般情况下选择后者,此时系统会弹出“浏览文件夹”对话框,我们选择好了目录之后单击“确定”,则新目录会出现在搜索路径中。MATLAB的帮助系统HelpDesk该窗口是一个独立的交互式帮助浏览器,用户可以在命令窗口中输入helpdesk或helpwin来启动帮助窗口。通过帮助窗口中的帮助主题(Contents)、帮助索引(Index)和联机演示(Demos)可以浏览用户可能需要的内容,而在查询结果(SearchResults)中可以查看按用户要求得到的帮助信息列表

>>helpdesk >>helpwin >>docHelpDesk是HTML格式的帮助文档,HelpDesk的搜索可以使用不完全关键字,MATLAB里包含了大量关于MATLAB安装、使用、编程以及各种工具箱等的电子版手册,具有搜索功能,因此也可以在指定的手册中搜索关键字,使用非常方便。MATLAB的帮助系统help命令当用户知道函数名称想了解其具体用法时,可以在命令窗口使用help命令,调用方法是help函数名,例如想了解矩阵求逆函数inv()的用法,可以在命令窗口输入help命令

>>helpinvlookfor命令lookfor命令与help不同,help命令要求函数名的精确匹配,而lookfor只要求与每个函数中的总结信息有匹配。所以当用户不知道函数的确切名称时可以使用lookfor命令,此时只需知道函数的部分关键字,调用格式为lookfor

关键字。例如若用户不知道MATLAB中矩阵求逆的函数,而求逆函数的关键字为inverse,则可以在命令窗口输入如下命令:

>>lookforinverse根据列出命令的总结信息,可以找到矩阵求逆的函数为inv-Matrixinverse。MATLAB基本使用方法MATLAB中的数据类型(1)数值型数据通常以双精度数值来表示,不区分整数、实数、复数等虚数单位i=sqrt(-1),复数z=a+b*i或z=r*exp(i*θ),且注意当复数的虚部为一个确定的数(而不是变量或者矩阵)时,可以省略系数和虚数单位之间的“*”,即3+i*6可以写成3+6i,但是x+i*y不能写成x+yi;当复数作为矩阵元素时,复数内不能留有空格,否则可能会被当作两个元素处理而出错。例如k1为一向量,但是k2则是一个矩阵。>>k1=[3+4i;5+6i]k1=3.0000+4.0000i5.0000+6.0000i>>k2=[3+4i;5+6i] %复数作为矩阵元素时,复数内不能留有空格k2=3.00000+4.0000i5.00000+6.0000iMATLAB中的数据类型(2)符号型数据

符号型数据则是在MATLAB中定义的特殊变量,它以字符串的形式表示,但又不同于普通字符串。其变量、表达式均为符号对象。符号对象使用sym或者syms生成,语法格式为

>>symsarg1arg2….arg_props

符号对象命令举例

>>symsxy; %利用syms生成符号对象

>>z=sym(‘z’); %利用sym生成符号对象 >>symspreal; %声明符号对象p为实的

>>m=sym('m','real'); %声明符号对象m为实的

>>n=sym('n','positive'); %声明符号对象n为正的

>>m=sym('m','unreal'); %去掉m的附加属性

>>A=[1x;yz] %生成符号矩阵

>>f=sin(x)+cos(x); %建立符号表达式MATLAB中的数据类型(3)字符串型数据MATLAB作为一种高级语言,字符串运算功能也是很丰富的,字符串就是字符数组,在字符串里的每个字符是数组里的一个元素,字符串中空格也是字符,由于字符串是以向量的形式来存储的,因而可以通过它的下标对字符串中的任何一个元素进行访问在MATLAB增加了符号运算工具箱,字符串成为符号运算表达式的基本构成单位举例

>>s1='MATLABSTRING'; %生成字符串s1>>dim=size(s1) %显示s1的维数,1×13阶矩阵dim=13>>s2=['MATLABSTRING']; %生成字符数组s2,与s1等价>>s1(2); %通过下标访问字符串,ans=AMATLAB中的数据类型(4)多维数组

数组也可以嵌套,一个数组的元素可以是另外一个数组,这样就构成了多维数组,例如三维数组就是一般矩阵的拓展,可以直接用于彩色图像的描述,在实际编程中可能用到更高维的数组。如图所示即为一个三维数组的示意图,数组的第一维称为“行”,第二维称为“列”,第三维称为“页”,运算则与低维的类似。

>>A=[12;13];>>B(:,:,1)=A; %输入矩阵B的第一页

>>B(:,:,2)=A^2; %输入矩阵B的第二页

>>B(:,:,3)=A^2; %输入矩阵B的第三页>>C=ones(2,2,3); %矩阵C为为2×2×3维全1矩阵>>D=C./B %三维矩阵间的./运算D(:,:,1)=1.00000.50001.00000.3333D(:,:,2)=0.33330.12500.25000.0909D(:,:,3)=0.33330.12500.25000.0909MATLAB中的数据类型(5)元胞数组存储形式类似于矩阵,元胞数组的各元素不一定是数值,可以是MATLAB支持的任意存储类型,并且各元素的类型也可以不尽相同。其元素就被称为“元胞”(cell)。元胞数组也用下标标识,但元胞数组中有元胞元素和元胞元素的内容两个概念,用圆括号表示元胞元素,用大括号来包含元胞元素的内容,cell_array{i,j}即表示元胞数组cell_array的第i行,第j列的存储内容,亦即元胞元素cell_array(i,j)的内容。>>A=[25;42]; %矩阵的定义使用[]>>B={A,[69];'test',[16;74]} %元胞数组的定义使用{}B= %仅显示存储量类型

[2x2double][1x2double]'test'[2x2double]>>C(1,1)={[13;57]}; %C(1,1)代表元胞元素,其内容是一矩阵>>C{1,2}=[24;68]; %C{1,2}代表C(1,2)的内容,为一矩阵>>celldisp(C) %显示元胞数组C的具体内容MATLAB中的数据类型(6)结构型数组结构型数组与元胞数组类似,不同之处在于结构型数组利用指针方式传递数据。在结构数组的直接赋值定义过程中,需要指出结构中的属性名,并且以指针操作符“.”来连接结构型数组与属性名,在命令行提示符后输入结构型数组的名称,则可显示其属性以及属性值

>>student_1.name='lin

hong';>>student_1.stature=182;>>student_1.weight=79;>>student_1student_1=name: 'linhong'stature: 182weight: 79MATLAB中的变量变量命名规则变量名由一个字母导引,后面可以跟字母、数字、下划线等,但不能用空格或者标点符号。例如var_temp、control_input1、state21均是合法变量名,而_output、45time、@position等均是非法变量名。变量名不能是MATLAB的保留字,例如for、end、while、if等命令名。MATLAB中的变量名是大小写敏感的,即A和a代表不同的变量。变量名长度不能超过63位。变量的定义和赋值方式为:赋值变量=赋值表达式变量是MATLAB的基本元素之一,但其用法的特殊之处在于:MATLAB表达式中可以使用矩阵形式MATLAB中不需要预先声明变量的类型和维数,MATLAB会根据对新变量的操作创建该变量,确定其类型并为其分配存储空间对已经存在的变量的赋值操作,MATLAB会以新值代替旧值。如果需要的话,MATLAB可以改变该变量的类型(例如将字符串型数据赋给原数值型数据变量时)或者为其分配新的存储空间(例如当矩阵维数发生变化时)MATLAB中的常量常量常量是一些在MATLAB中预先定义好数值的变量,既然其本质是变量,就可以对其进行重新赋值,但在编程时,为了避免不必要的麻烦,请尽量避免对这些特定常量的重新赋值。表中就是一些MATLAB中的常量。常量名用法pi圆周率πeps机器的浮点运算误差限,2.2204e-016,若|x|<eps,则可以认为x=0i,j虚数单位narginm函数入口参数变量,用于m函数程序设计nargoutm函数出口参数变量,用于m函数程序设计realmin最小的正浮点数2.2251e-308realmax最大的正浮点数1.7977e+308bitmax最大的正整数9.0072e+015InfInfinity,无穷大量+∞NaNNot-a-number,通常由0/0运算、Inf/Inf运算或者其他可能运算得出ans默认结果存储变量MATLAB中的矩阵矩阵和向量数学上,一个m行n列的矩形阵列被称为一个m×n矩阵,矩阵一般由数组成。特别的,标量可看作是1×1的矩阵,列向量可看作是n×1的矩阵,而行向量则是1×n的矩阵。矩阵定义矩阵是MATLAB中的一种基本运算对象。在MATLAB语言中不必描述矩阵的维数和类型,它们是由输入的格式和内容来确定的矩阵操作MATLAB可以根据用户的需要以直接输入、命令行语句、函数构造等方式生成特定的矩阵,同时还可以通过提取或者扩充等方式对已有矩阵进行相关的操作矩阵生成(1)以直接输入的方式生成矩阵

矩阵元素必须在“[]”内矩阵的同行元素之间用空格(或“,”)隔开;矩阵的行与行之间用“;”(或回车符)隔开;矩阵的元素可以是数值、变量、表达式或函数。

>>A=[12345]; %生成行向量,同行元素之间用空格隔开

>>A=[1,2,3,4,5]; %生成行向量,同行元素之间用,隔开

>>B=[1;2;3;4;5]; %生成列向量>>A=[294;753;618]; %三阶幻方矩阵输入方式1>>A=[2,9,4;7,5,3;6,1,8]; %三阶幻方矩阵输入方式2>>A %显示输入的矩阵A=294753618>>C=[1+9i2+8i3+7i;4+6i5+5i6+4i;7+3i8+2i9+i];%复数矩阵的直接输入矩阵生成(2)以命令行语句或函数方式生成矩阵冒号表达式产生一个行向量Vec=start:step:end

(step默认为1)

>>Vec=0:2:8; %[0,2,4,6,8] >>Vec=1:3;

%[1,2,3],默认step=1linspace()生成线性等间距格式行向量linspace(start,end,num),其中start和end是生成向量的第一个和最后一个元素,num是元素总数。等价于a:(b-a)/(n-1):b >>Vec=linspace(0,3,4); %[0,1,2,3],递增 >>Vec=linspace(5,2,4); %[5,4,3,2],递减logspace()生成等比格式行向量,Vec=logspace(start,end,num),创建从10start开始,到10end结束,有num个元素的对数分隔行向量。默认num=50,该命令等价于10.^linspace(start,end,num)

>>Vec=logspace(0,3,4) %[1,10,100,1000] >>Vec=logspace(2,0,3) %[100,10,1]矩阵生成(3)特殊的矩阵生成函数ones()生成全1矩阵,zeros()生成生全0矩阵,eye()生成单位阵>>A=ones(3) %生成3×3维全1矩阵>>A=ones(2,3) %生成2×3维全1矩阵>>A=zeros(2) %生成2×2维全0矩阵>>A=zeros(3,2) %生成3×2维全0矩阵>>A=eye(3) %生成3×3维单位阵

>>A=eye(3,5)>>A=eye(5,3)rand()生成随机矩阵,元素满足在(0,1)区间内的均匀分布

>>A=rand(3) %生成3×3维rand()随机矩阵

>>A=rand(2,3) %生成2×3维rand()随机矩阵randn()生成随机矩阵,元素满足均值为0,方差为1的标准正态分布

>>A=randn(3) %生成3×3维randn()随机矩阵

>>A=randn(2,3) %生成2×3维randn()随机矩阵矩阵的访问与赋值向量的访问向量是有多个有序元素组成的,因而可以直接通过向量的下标来对向量中的元素进行访问和修改,Vec(i)即表示向量Vec中的第i个元素。特别提出的是,可以通过冒号表达式对向量元素进行访问,也可以用中括号方式任意指定多个向量元素进行访问。

>>Vec=rand(1,6); %生成一个1×6的随机行向量

>>Vec(3); %通过下标访问向量的第3个元素

>>Vec(5)=0; %通过下标修改向量第5个元素的值,赋值为0>>Vec(2:4); %访问向量的第2个到第4个元素

>>Vec(2:2:6); %访问向量的第2、4、6个元素

>>Vec([134]); %中括号访问多个指定的向量元素

>>Vec([13])=[00]; %修改多个指定的向量元素的值

>>Vec(4:end); %end参数表示结尾矩阵的访问A(i,j)表示A中第i行、第j列的元素(一维下标为按列方式)

>>A=[417;256;389] %生成一个3×3的矩阵

>>A(3,3) %访问A的第3行第3列的元素

>>A(3,2)=0 %修改A的第3行第2列的元素矩阵的拆分和提取(1)矩阵的拆分冒号表达式A(:,j) —A的第j列全部元素A(i,:) —A第i行的全部元素A(i:i+m,:) —A矩阵第i~i+m行的全部元素A(:,k:k+m) —A矩阵第k~k+m列的全部元素A(i:i+m,k:k+m) —A矩阵第i~i+m行内,并在第k~k+m列中的所有元素end运算符和中括号方式>>A=randn(3,3) %生成3×3的随机矩阵>>A(2,:) %A第2行的全部元素>>A(:,3) %A的第3列全部元素>>A(2:3,:) %A的第2~3行的全部元素>>A(:,1:2) %A的第1~2列的全部元素>>A(2:3,1:2) %A的第2~3行内,并在第1~2列中的所有元素>>F=A([1,1,2],:) %通过中括号复制A的第1行2次,第2行1次>>B=eye(3) %生成3×3阶单位阵B>>A(:,[13])=B(:,2:3) %将A的第1、3行用B的第2行到第3行取代

矩阵的拆分和提取(2)空矩阵定义[]为空矩阵。给变量A赋空矩阵的语句为A=[]。注意,A=[]与clearA不同,clear是将A从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。可以利用空矩阵删除矩阵的元素。

>>A=[417;256;389] >>A(2,:)=[] %删除A的第二行

矩阵的提取diag()是抽取矩阵主对角线元素tril()是抽取矩阵的主下三角元素triu()是抽取矩阵主上三角元素

>>A=[123;456;789] >>diag(A) %抽取矩阵A的主对角线元素

>>tril(A) %抽取矩阵A的主下三角元素

>>triu(A) %抽取矩阵A的主上三角元素

矩阵的扩展子矩阵扩展在MATLAB中可以通过把矩阵B的子块赋值为A来扩展矩阵A,假设A为m×n维矩阵,一般的命令格式为:B(r1:r2,c1:c2)=A,且需注意维数一致,即r2-r1+1=m且c2-c1+1=n。对于B中原先并不存在的元素,MATLAB将自动补0 >>A=[135;246] >>B(2:3,2:4)=A %将A矩阵扩充,使得A成为B的一个子块矩阵连接设A为m×n1维矩阵、B是m×n2维矩阵,注意其行数相同,则我们将矩阵A、B按行连接成m×(n1+n2)维的矩阵C,可以写成C=[A,B]设A为m1×n维矩阵、B为m2×n维矩阵,注意其列数相同,则我们将矩阵A、B纵向连接成(m1+m2)×n维的矩阵C,可以写成C=[A;B] >>A=[132;432];B=[17;56]; >>C=[A,B] %横向连接

>>A=[35;21];B=[74;36;91]; >>C=[A;B] %纵向连接

矩阵的变维矩阵的变维reshape命令可以实现矩阵的变维,该命令将矩阵已有元素按照用户指定的方式生成新的矩阵,例如B=reshape(A,m,n)命令将生成矩阵B,B为m×n维矩阵,且B的元素按列从A中抽取,如果A的元素少于m×n,则MATLAB返回错误信息另一种变维的方式是首先定义矩阵的结构,然后将已有的元素填充的新定义的矩阵中去,这里元素的填充方式仍然是按列的方式

>>A=1:6 %生成1×6维的行向量

>>B=reshape(A,2,3) %将行向量的元素值重构为维矩阵

>>C=zeros(3,2);C(:)=B(:) %将2×3维矩阵重构为3×2维矩阵矩阵的变向矩阵的转置转置运算符是单撇号(’),矩阵A的转置在MATLAB中用A’来表示,如果A是复数矩阵,则A’为A的共轭转置矩阵,而非共轭转置矩阵可用A.’来求得

>>A=[12;34] >>A'; %实矩阵的转置

>>B=[1+i2;1i] >>B' %复矩阵的共轭转置

>>B.‘ %复矩阵的非共轭转置矩阵的旋转rot90(A,k)将矩阵A旋转90º的k倍,当k为1时可省略fliplr(A) 对矩阵实施左右翻转flipud(A)矩阵A实施上下翻转的函数

>>rot90(A); %将矩阵A旋转90º >>fliplr(A); %将矩阵A左右翻转

>>flipud(A); %将矩阵A上下翻转MATLAB的矩阵运算矩阵的代数运算(1)基本运算矩阵加减矩阵加减即将A和B矩阵的对应元素相加减。若参与运算的两矩阵之一为标量,则将标量与矩阵的所有元素分别进行加减操作。注意维数匹配。矩阵乘法设有矩阵A和B,若A为m×n维矩阵,B为n×p维矩阵,注意矩阵A的列数等于矩阵B的行数,则可以由C=A*B实现矩阵的乘法,结果为m×p维矩阵。矩阵除法左除\:A\B等价于inv(A)*B,亦即方程A*x=B的解右除/:B/A等价于B*inv(A),亦即方程x*A=B的解

>>A=[12;34]; >>B=[10;01]; >>A+2 %[34;56]矩阵与标量相加,将标量与矩阵的所有元素相加

>>A+B %[22;35]对应元素相加

>>A-B %[02;33]对应元素相减

>>A*B %B是单位阵,故结果为[12;34] >>A/B %方程x*B=A的解AB-1:[12;34] >>A\B %方程A*x=B的解A-1B:[-21;1.5-0.5]矩阵的代数运算(2)点运算(维数不变,对应元素做相应运算)在MATLAB中,有一种特殊的点运算。点运算符有.*(点乘)、./(点右除)、.\(点左除)和.^(点乘方)。两个矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。 >>A=[12;34],B=[56;78]; >>A.*B %.*:A和B对应元素相乘,注意和A*B的区别 >>A./B %./:A和B对应元素相除,注意和A/B的区别 >>A.^3 %.^:对应元素和标量的乘方 >>A.^A %.^:对应矩阵元素之间的乘方 >>A.‘ %.’:非共轭转置,注意.‘与’,‘为共轭转置矩阵的维数

>>[m,n]=size(A) %返回矩阵的行数m和列数n >>M=size(A) %在矩阵M中返回矩阵的行数、列数

>>len=length(A) %返回矩阵A行数和列数中的最大值矩阵的关系与逻辑运算关系运算符和逻辑运算符矩阵的关系运算符和逻辑运算符有:<、<=、>、>=、==、~=、&、|、~。在关系与逻辑运算中,“真”用1表示,“假”用0表示,在逻辑运算中,所有的非零元素均按照1来处理,这和一般的关系与逻辑运算是相同的。运算规则若参与关系与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行比较或运算。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成。若参与关系与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行比较或运算。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成。

>>A=[13;69];B=[42;07];A>=B; %同维矩阵的关系运算

>>a=5;A=[25;61];a==A; %标量与矩阵的关系运算

>>A=[43;01];B=[10;23];A|B; %同维矩阵的或运算

>>a=2;A=[01;32];a&A; %标量与矩阵的与运算矩阵分析(1)矩阵的行列式运算对一个方阵可以通过det命令求矩阵的行列式,如果参数矩阵为非方阵则会返回维数不匹配的错误信息。若A为数值矩阵,则得出数值计算结果,若A为符号矩阵,则得出解析解。 >>A=magic(3); %[816;357;492] >>det(A) %-360 ans= -360 >>symsabcd; >>A=[ab;cd]; >>det(A) ans= a*d-b*c矩阵分析(2)矩阵的秩运算矩阵的行向量(或者列向量)中的最大线性无关组的个数称为矩阵的秩。在MATLAB中,求矩阵秩的函数是rank(A) >>A=rand(3); >>rank(A) ans= 3 >>B=[123;456];B(3,:)=2*B(1,:)+3*B(2,:); >>rank(B) ans=

2 >>C=ones(3); >>rank(C) ans= 1矩阵分析(3)矩阵的求逆运算若矩阵A为方阵且满秩,且存在一个与其同阶的方阵B,使得:AB=BA=I(I为单位矩阵)则称A为B互为逆矩阵。求方阵A的逆矩阵可调用函数inv(A)若矩阵A不是方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A’同型的矩阵B,使得:ABA=A,BAB=B

此时称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。在MATLAB中,求一个矩阵伪逆的函数是pinv(A)

>>A=magic(4);inv(A);A^(-1) %满秩方阵的逆

>>A=[123;456];pinv(A); %非方阵的广义逆

>>B=[123;456;579];pinv(B); %非满秩矩阵的广义逆矩阵分析(4)矩阵的特征值和特征向量运算对矩阵A而言,满足PA(λ)=det(λI-A)=0的根λ为矩阵A的特征值。满足λiv=Av的向量v为矩阵A关于特征值λi的特征向量,PA(λ)称为矩阵A的特征多项式。在MATLAB中,矩阵的特征值和特征向量可以调用函数eig()求得。调用格式如下E=eig(A):求矩阵A的全部特征值,构成向量E[V,D]=eig(A):D为对角阵,其对角线上的元素为矩阵A的特征值,每个特征值对应的特征向量即为矩阵V的对应列,且特征向量均进行模方归一化处理[V,D]=eig(A,‘nobalance’):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,其每个特征向量各元素的平方和均为1,而格式3直接求矩阵A的特征值和特征向量,并不进行归一化处理>>A=magic(3);>>E=eig(A);>>[V,D]=eig(A);>>[V,D]=eig(A,‘nobalance’)矩阵分析(5)矩阵的迹运算若矩阵A为方阵,则矩阵A的迹即为该矩阵对角线上各元素的和。矩阵的迹和该矩阵的特征值之和是相同的。在MATLAB中求矩阵A的迹的函数为trace(A) >>A=magic(3) %生成三阶幻方矩阵A >>trace(A) %求A的迹

ans= 15 >>v=eig(A) %验证矩阵A的迹与其特征值的和相等

v= 15.0000 4.8990 -4.8990 >>sum_of_eig_A=v(1)+v(2)+v(3)

sum_of_eig_A= 15.0000矩阵的超越函数超越函数MATLAB语言中的exp、sqrt和log等函数命令也可以作用到矩阵上,但这种运算只是定义在矩阵的单个元素上在超越数学函数的后面加上字母m从而构成矩阵的超越函数,expm、sqrtm和logm分别为矩阵指数、矩阵开方和矩阵对数。矩阵的超越函数要求运算的矩阵必须为方阵。矩阵的超越函数也可以用一般的形式表示,如矩阵指数用funm(A,'exp')函数命令可以实现,但它们所采用的算法不同,其计算结果会有微小的差别

>>A=magic(2) %生成二阶魔方矩阵

>>expm(A) %矩阵乘方

>>logm(A) %矩阵对数

>>funm(A,‘log’) %另一种形式的对数调用MATLAB的符号运算符号表达式的化简假设符号表达式为f,对符号表达式化简的函数有:simplify(f) 应用函数规则对f进行化简。simple(f) 调用MATLAB的相关函数对表达式进行综合化 简,并显示化简过程 >>symsxy; >>f=(x^2+y^2)^2+(x^2-y^2)^2+sin(x)^2+cos(x)^2; >>simplify(f)

ans= 2*x^4+2*y^4+1因式分解符号表达式的因式分解函数为factor(f) >>symsx; >>f=x^3-1; %生成符号表达式f=x3-1 >>f1=factor(f) %对f=x3-1进行因式分解,结果存入f1 f1= (x-1)*(x^2+x+1)符号微积分(1)符号极限在MATLAB中调用limit()函数可以求取符号表达式的极限,设符号表达式为f,调用函数格式如下:limit(f,x,a) 计算f在x→a条件下的极限;limit(f,a) 计算f中由默认自变量趋向于a条件下的极限;limit(f) 计算f在默认自变量趋向于0条件下的极限;limit(f,x,a,‘right’)和limit(f,x,a,‘left’)计算f在x→a条件下的右极限和左极限。 >>symsxa; >>f=(1+a/x)^x; >>r1=limit(sin(x)/x) %求符号表达式1的极限值 r1= 1 >>r2=limit(f,x,inf,'left') %求符号表达式2的极限值 r2=

exp(a)符号微积分(2)符号微分在MATLAB中调用diff()函数可以求取符号表达式的极限,设符号表达式为f,调用函数格式如下:diff(f) 求f对于默认自变量的微分diff(f,x) 求f对于自变量x的微分diff(f,n) 求f对于默认自变量的n次微分>>symsx>>f=exp(x)*sin(x);>>r1=diff(f) %求符号表达式f的一次微分r1=exp(x)*cos(x)+exp(x)*sin(x)>>r2=diff(f,2) %求符号表达式f的二次微分r2=2*exp(x)*cos(x)符号微积分(3)符号积分在MATLAB中调用int()函数可以求取符号表达式的积分,设符号表达式为f,调用函数格式如下:int(f) 求f对于默认自变量的不定积分int(f,x) 求f对于自变量x的不定积分int(f,a,b) 求f对于默认自变量从a到b的定积分>>symsx;>>f1=-2*x/(1+x^2)^2;>>f2=x*log(1+x);>>r1=int(f1) %求符号表达式1的不定积分>>r2=int(f2,0,1) %求符号表达式2的定积分r1=1/(x^2+1)r2=1/4多项式(1)应用背景多项式在工程计算中有着广泛的应用,在很多情况下,特殊函数都可以用Taylor级数展开成多项式的形式,控制系统的传递函数可以用多项式的形式表述多项式的定义直接输入MATLAB采用行向量表示多项式,将多项式的系数按降幂次序存放在行向量中即可,多项式P(x)=anxn+…+a1x+a0表示为P=[an,an-1,…,a1,a0]命令poly如果A是矩阵,则poly(A)将创建矩阵A的特征多项式;如果A是向量,则poly(A)将创建以A中各元素为根的多项式

>>A=magic(2); %二阶魔方矩阵

>>poly(A); %矩阵A的特征多项式

>>symsx;det(x*eye(2)-A); %验证是否相符

>>A=[123];>>poly(A); %创建以123为根的多项式

>>symsx;>>expand((x-1)*(x-2)*(x-3)); %验证多项式显示poly2sym(p,'x')多项式(2)多项式运算多项式加减:+-使用Matlab的运算符+-实现多项式的加减法对于次数相同的多项式,可以直接对其系数向量进行加减运算;如果两个多项式次数不同,则应该把低次多项式中系数不足的高次项用0补足,然后进行加减运算>>pa=[1-1-26]; %pa=x3-x2-2x+6>>pb=[0123]; %pb=x2+2x+3>>p=pa+pb %多项式相加,向量维数必须相同,低次多项式补零p= %相加以后的结果1009多项式(3)多项式运算多项式相乘:p=conv(p1,p2)p为多项式p1和多项式p2的乘积>>p=[2,-1,0,3];q=[2,1];>>k=conv(p,q); %(2x3-x2+3)(2x+1)k=40-163>>m=conv([11],conv([12],conv([13],[14]))) %(x+1)(x+2)(x+3)(x+4)m=110355024多项式相除:[q,r]=deconv(p1,p2)多项式p1除以多项式p2,商多项式为q,余多项式为r[q,r]=deconv(p1,p2)p1=conv(q,p2)+r>>p1=[123];p2=[12];[q,r]=deconv(p1,p2)q=10r=003多项式(4)多项式运算多项式求导

dp=polyder(p) 多项式p的导数多项式为dp

dp=polyder(p1,p2) 多项式p1和多项式p2乘积的导数多项式为dp

[num,den]=polyder(p1,p2)有理分式(p1/p2)的求导后的有理分式为(num/den)多项式求值代数多项式求值y=polyval(p,x)求多项式p在自变量为x时的值,若x是向量或矩阵,则采用数组运算(点运算)!矩阵多项式求值Y=ployvalm(p,A)按矩阵运算规则求多项式p在自变量为A时的值,当自变量A为矩阵时,多项式中的常数项a0被当作a0*eye(n)处理例如对于多项式p(x)=2x3-x2+3

polyvalm(p,A)=2*A*A*A-A*A+3*eye(size(A))

polyval(p,A)=2*A.*A.*A-A.*A+3*ones(size(A))多项式(5)多项式运算多项式求根:r=roots(p) r为多项式p的根组成的列向量>>p=[132];roots(p)ans=-2-1部分分式分解:[r,p,k]=residue(num,den)有理分式(num/den)部分分式分解后,r为留数,p为极点,k为直项>>num=[1

11

39

52

26];den=[1

10

35

50

24]; %无重极点>>[r,p,k]=residue(num,den);>>num=[0

1

4

6];den=[1

3

3

1]; %有重极点>>[r,p,k]=residue(num,den)多项式拟合:p=polyfit(x,y,n) 由给定数据x和y拟合出n阶多项式p,用来逼近y=f(x)曲线使用非线性拟合工具箱cftoolMATLAB编程基础引言在前面的内容中,我们掌握了MATLAB的基础知识,学会了如何在MATLAB的命令窗口进行科学计算操作,例如矩阵计算、符号计算等,这些语句按照用户输入的固定顺序一个接一个的执行,它首先读取输入,然后运算得到所需结果,打印出结果,这和编程中的顺序结构编程类似,在之前的例子中,我们不能重复运算程序的某些部分,也不能根据输入的值,有选择地执行程序的某些部分。在下面的内容中,我们将视野扩大至顺序结构以外的流程控制结构,向读者介绍MATLAB编程方法,循序渐进,首先讲解MATLAB编程中的几种流程控制结构,而后介绍MATLAB中的脚本文件和M函数文件的编写,最后针对已经编好的程序介绍如何调试程序。MATLAB中的控制结构循环结构for循环while循环选择结构if结构switch结构try/catch结构其他流程控制语句break语句continue语句for循环循环终止条件for循环的循环终止条件通常是对循环次数的判断,达到预先设定好的循环次数则循环结束,所以for循环的次数是确定的语法 forindex=expression

loopbody end

其中,index是循环变量,expression是循环控制表达式,在for和end之前的执行语句为循环体(loopbody)执行顺序变量index读取表达式expression,其在一般情况下是一个向量,用冒号表达式表示为start:increment:end,若采用默认的步长1,则表示为start:end;在这种情况下,循环变量index每次从向量expression中读取一个元素,然后程序执行循环体(loopbody),直至向量expression中所有元素读取完毕,故一般而言,向量expression中有多少元素,循环体就执行多少次for循环利用for循环求6! >>N=6;S=1; >>fori=N:-1:1 S=S*i; end >>S S= 720求解级数求和问题 >>S=0; >>fori=1:100000 S=S+1/2^i+1/3^i; endfor循环for循环可以嵌套使用,请用这种方法打印九九乘法表>>fori=1:9forj=1:ifprintf('%d*%d=%d',i,j,i*j);endfprintf('\n');end1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=155*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81while循环循环终止条件对循环条件表达式的判断,只要循环条件表达式为真,则循环体就重复执行,直到循环条件表达式为假。所以while循环的次数不确定语法 whilecondition

loopbody end如果condition的值非零(true),程序将执行循环体(loopbody),然后返回到while语句执行,直到condition的值变为零(false),这个重复过程结束。当程序执行到while语句且condition的值为0之后,程序将会执行end后面的第一个语句。while循环求Fibonacci数列的小于100的前n项 >>f(1)=1;f(2)=1; %Fibonacci数列的前两项 >>i=2; %项数标志 >>flag=0; %循环终止判断标志变量 >>while(flag<100) %终止条件是循环终止判断标志变量小于100 i=i+1;

f(i)=f(i-1)+f(i-2); %Fibonacci数列项的求取方法 flag=f(i)+f(i-1); %循环终止判断变量,已求数列的最后两项和 end

求出满足的最小m值 >>s=0;m=0 >>while(s<=10000) m=m+1; s=s+m; end [s,m]

ans= 10011 141if结构if-end结构

ifcondition statements end其中当条件表达式condition的值为真(非0)时执行语句段statements

if-else-end结构 ifcondition statements_1 else statements_2 end其中当条件表达式condition的值非0时执行语句段statements_1,否则执行语句段statements_2if结构if-elseif-…-else-end结构 ifcondition_1 statements_1

elseifcondition_2 %这里可以有多个elseif statements_2 else statements_3 end在这种结构控制下,当运行到程序的某一条条件表达式为真(非0)时,则执行与之相关的语句段,而后系统不再检查其他的条件表达式,系统将跳过if结构中的其他语句。具体执行顺序为:如果条件表达式condition_1的值非0,那么程序将会执行语句段statements_1,然后跳转到end后面的第一个可执行语句继续执行。否则,程序将会检测条件表达式condition_2的值,如果condition_2的值非0,那么程序将会执行语句段statements_2,然后跳转到end后面的第一个可执行语句继续执行。如果所有的控制表达式均为0,那么程序将会执行与else相关的语句段statements_3

switch结构语法 switch(switch_expr) casecase_expr_1, statements_1 casecase_expr_2, statements_2 … otherwise,

statements_other end在这个控制结构中,主要是通过对switch_expr的值与下面表达式的值是否匹配来决定程序的转向的。如果switch_expr的值与case_expr_1相符,那么第一个语句段statements_1将会被执行,然后程序将会跳转到switch结构结束语句end后的第一个语句。如果switch_expr的值与case_expr_2相符,那么第二个语句段将会被执行,然后程序将会跳到switch结构结束语句end后的第一个语句。在这个结构中,otherwise语句段是可选的。如果它存在的话,当switch_expr的值与其他所有的选项都不相符时,语句段statements_other将会被执行。如果它不存在,且witch_expr的值与所有的选项都不相符时,结构中的任何一个语句段都不会被执行。switch结构注意如果switch_expr有很多值可以导致相同代码的执行,那么这些值可以括在同一括号内,如果这个switch表达式和括号中任何一个值相匹配,那么这个语句段将会被执行。

switch(switch_expr) case{case_expr_1,case_expr_2,case_expr_3}, statements otherwise,

statements_other endswitch结构 day=input('请输入英文日期如:Sunday\n','s');switchday case{'Sunday','sunday'}

disp('星期日');

case{'Monday','monday'}

disp('星期一');

case{'Tuesday','tuesday'}

disp('星期二');

case{'Wednesday','wednesday'}

disp('星期三');

case{'Thursday','thursday'}

disp('星期四');

case{'Friday','friday'}

disp('星期五');

case{'Saturday','saturday'}

disp('星期六');

otherwise

disp('Error');

end其他流程控制语句break语句和continue语句break语句和continue语句用于循环中的流程控制。一般可以和if语句配合使用。break语句用于终止循环的执行,当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。如果break或continue语句出现在循环嵌套的内部,那么break语句和continue语句将会在包含它的最内部的循环起作用。求[200,500]之间第一个能被53整除的整数 >>fori=200:500 ifrem(i,53)~=0 continue end break end >>i i=

212

其他流程控制语句return语句当用户需要在文件中进行终止操作时,可以使用return命令,执行return命令后,进程将返回调用函数或者键盘。运用return命令可以提前结束程序的运行。return和break的区别在于return一般用于函数或者文件的结束,而break用于循环的终止。文件的编写与调试为什么?当我们遇到综合性问题时,命令窗口将不再适合,而需要用到程序编辑与调试的环境,在MATLAB中我们称之为M文件编辑器。利用它我们可以实现对MATLAB命令行语句段的批处理,或者对M文件进行保存和调用,使得MATLAB的功能得到了极大的扩展,适用于较大规模程序的编制,并以此解决更为复杂的工程问题如何?MATLAB下提供了两种源程序文件格式,其中一种是普通的ASCII码构成的文件,在这样的文件中包含了一族由MATLAB语言所支持的语句,它类似于DOS下的批处理文件,这种文件称为M-脚本文件;而MATLAB程序设计的主流方法是M-函数文件在实际编程中,推荐使用M-函数文件格式编程M文件M文件MATLAB程序,大致分为两类:M脚本文件

(M-Script)和M函数文件(M-function),它们均是普通的ASCII码构成的文件,后缀均为.m。M文件名的命名规则,文件名必须以字母开头,而后可以是英文、数字和下划线的组合,文件名首字符不能是数字或下划线,M文件名中不能含有空格;同时,M文件名文件名不能与Matlab的内部函数名相同,因而我们建议对M文件的命名尽量不要是简单的英文单词,简单的单词命名容易与MATLAB内部函数同名,还有一点需要注意,虽然MATLAB对M文件名是大小写敏感的,但Windows的文件名是不区分大小写的,为了文件的保存方便,实现不同平台之间的通用性,,建议M文件名尽量只使用小写。M文件编辑器功能编写用户的M文件打开和修改M文件,观察变量值、调试程序等启动M文件编辑器在命令窗口输入edit命令可进入M文件编辑器,此时MATLAB将建立一个空文件,如果需要查看、编辑或者修改已经存在的M文件,例如文件名为test.m,则用户只需在命令窗口输入edittest或者edittest.m;或者在Windows文件夹中双击该文件单击工具栏上的M-file按钮,此时MATLAB将建立一个空文件;通过File|New菜单可以选择建立不同类型的M-file,包括空M文件、函数M文件和类M文件,当选择建立函数M文件或者类M文件时,MATLAB会自动给出相应文件类型的模版。注意每次修改程序之后都要存盘M脚本文件适用范围M脚本文件适用于用户所需要立即得到结果的小规模运算使用方法M脚本文件中存储的是可用于自动重复执行的一组MATLAB命令和函数组合。M脚本文件等价于从命令窗口中顺序输入文件里的命令,程序只要依次将命令编辑在命令文件中,再保存成为扩展名为.m的M脚本文件即可。M脚本文件的执行方式第一种方式是在M文件编辑器的工具栏中点击Run按钮,第二种方式类似批处理文件,只需要在MATLAB命令窗口的命令行提示符>>之后键入M脚本文件的文件名即可,这样MATLAB将自动执行该M脚本文件中的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论