matlab里知道欧几里德matlab求距离矩阵阵怎么得到进化树的最后图形

基于MATLAB实现分形图形的绘制论文-免费论文
欢迎来到网学网学习,获得大量论文和程序!
基于MATLAB实现分形图形的绘制论文
【Matlab论文栏目提醒】:为需要Matlab论文的朋友们搜集整理了基于MATLAB实现分形图形的绘制论文 - 培训资料相关资料,希望对各位网友有所帮助!
前 言 ........................................................... 1 第一章 MATLAB介绍 .............................................. 2 1.1 MATLAB简介 .............................................. 2 1.2 MATLAB语言 .............................................. 2 1.2.1 创建向量、向量元素的访问: ......................... 2 1.2.2 创建矩阵、矩阵元素的访问 .......................... 3 1.2.3 流程控制 .......................................... 4 1.3 MATLAB语言的传统优点 .................................... 5 第二章 分形入门知识 ............................................. 6 2.1 分形理论 ................................................ 6 2.2 分形几何观及其应用 ...................................... 7 第三章 Koch雪花的绘制 ........................................... 7 3.1 von Koch曲线简介 ........................................ 8 3.2 Koch雪花算法设计 ........................................ 8 第四章 Frac_tree绘制 ........................................... 11 第五章 Mandelbort集的绘制 ...................................... 12 5.1 Mandelbort集简介 ....................................... 13 5.2 Mandelbort集算法设计 ................................... 13 第六章 Julia集的绘制 ........................................... 17 6.1 Julia集简介 ............................................ 18 6.2 Julia集的算法设计 ...................................... 18 6.3 Julia集与Mandelbort集 ................................. 20 第七章 花篮簇的绘制 ............................................ 22 总 结 .......................................................... 23 主要参考文献: .................................................. 23 第1页 分形是描述不规则几何形态的有力工具。&&&&不言而喻,不规则的几何形态在我们的周围处处可见,诸如花草、山脉、烟云、火焰等举目皆是。&&&&至于微观世界的复杂物质结构,宏观世界浩瀚天体的演变,更展现出了层出不穷的不规则几何形态,它们往往都是分形几何的研究对象。&&&& 大自然向人类展示其美丽多变形态的同时,也提出了难以回答的询问:怎样描述复杂的自然表象?恰恰是分形几何学,它把自然形态看作是具有无限嵌套层次的精细结构,并且在不同的尺度下保持某种相似的属性,于是在变换与迭代中得到描述自然形态的有效方法。&&&& 分形的研究离不开计算机。&&&&如果不是计算机图形图像处理功能的增强,不能想象怎样才能直观地看到Julia集和Mandelbort集的精细结构,更不能想象可以产生具有无限细结的自然景物和高度真实感的三维动画。&&&&反过来,分形理论与方法又极大地丰富了计算机图形学内容,甚至分形的思想会在科学的发展上产生一定的影响。&&&&下面我们将以MATLAB为平台,讲述用M语言实现分形图形的绘制。&&&& 在设计中我主要负责绘制图形的程序部分,由负责其界面制作、程序与界面接口调试工作。&&&& 在设计过程中,遇到了许多问题、困难,但是,在我的导师蒲俊教授和我的搭档黄娟同学一如既往的帮助和鼓励下,我们终于完成了。&&&&在此,特别向我的导师及搭档致以诚挚的谢意。&&&& 第2页 MATLAB是由美国的Math Work公司推出的一个为科学和工程计算而专门设计的高级交互式软件包。&&&&它是一种高性能的用于工程计算的编程软件,它把科学计算、编程和结果的可视化都集中在一个使用非常方便的环境中。&&&& MATLAB最早是做为矩阵实验室(Matrix Laboratory),20世纪70年代后期,时任美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的矩阵接口,此即用FORTRAN编写的萌芽状态的MATLAB。&&&&当其以商品形式出现后,短短几年,就以其良好的开放性和运行的可靠性,使原先控制领域里的封闭式软件包纷纷淘汰,而改以MATLAB为平台加以重建。&&&&进入20世纪90年代, MATLAB已经成为国际控制界公认的标准计算软件。&&&& Math Works公司于1993年推出MATLAB4.0版本,从此告别DOS版。&&&&从1997年,MATLAB5.0版问世到现在最新版本MATLAB6.5.1,MATLAB的功能不断得到加强,使其在科学计算、控制系统设计与分析、数学信号处理、数字图像处理、通讯系统仿真与等领域的应用独领风骚。&&&& 其典型的应用范围包括以下方面: 1 数学计算 2 算法推导 3 建模和仿真模拟 4 工程图形的绘制 5 应用程序的开发,包括用户图形界面的建立 向量的创建方法主要有下面两种: 第一种:逐个输入元素,彼此元素之间可以使用空格或者逗号作为间隔符。&&&&如x1 3 pi 35i或者x13pi35i形式; 第二种:利用冒号运算符创建向量基本语法为XJ:INC:K,其中J为向量的第一个元素,而K为向量的最后一个元素,INC为向量元素递增的步长。&&&&若在表达式中忽略INC,则默认的递增步长为1。&&&&INC可以为正数也可以为负数,如果INC为正数,则必须JltK 如果INC为负数,则必须JgtK,否则创建的为 空向量。&&&& 第3页 访问向量的元素只要使用相应元素的索引即可。&&&& 1. An 访问向量的第n个元素; 2. Ai j k或者 Aijk 访问向量的第i、j、k个元素; 3. Aj:kk:-1:j 重复访问向量中的元素。&&&& 这里,由于输入矩阵的元素、行、列较少,我们采用直接输入矩阵元素法来创建矩阵。&&&&如输入 A1 2 34 5 67 8 9 则??????????????????????A 在创建过程中,矩阵的元素行与行之间需要用分号“”间隔,也可以在需要分行的地方用回车键间隔,矩阵的元素之间可以使用逗号“”或者空格间隔。&&&&其实创建上面的矩阵还可以这么做A1:34:67:9。&&&& 我们可以将矩阵的每一行或者每一列看作一个向量,矩阵就是由若干向量 组合而成的。&&&&那么矩阵元素的访问则类似于向量元素的访问,使用索引即可。&&&& 表 1.1 使用索引访问矩阵元素的方法 矩阵元素的访问 说 明 Aij 访问矩阵A的第i行第j列上的元素,其中i和j为标量 AIJ 访问有向量I和J指定的矩阵A中的元素 Ai: 访问矩阵A中第i行的所有元素 A:j 访问矩阵A中第j列的所有元素 A: 访问矩阵A中的所有元素,将矩阵看作一个向量 Al 使用单下标的方式访问矩阵元素,其中l为标量 AL 访问有向量L指定的矩阵A的元素,向量L中的元素为矩阵元素的单下标数值 矩阵元素的单下标与全坐标之间的转换关系如下,以mn的矩阵为例,该矩阵的第i行第j列的元素全下标表示为单下标lj-1mi。&&&&为了方便全下标和单下标之间的转换,MATLAB提供了两个函数分别完成两者之间的相互转换: sub2ind:根据全下标计算单下标。&&&& 第4页 ind2sub:根据单下标计算全下标。&&&& 程序流程控制包含控制程序流程的基本结构和语法,例如应用程序的选择和循环结构,这也是结构化编程的基本基本结构,使用结构化的应用程序设计方法可以使设计的结构清晰、可读性强,能够提高应用程序的设计效率,增强程序的可维护性。&&&&结构化的程序主要有三种基本的程序结构:顺序结构、选择结构、循环结构。&&&& 本节主要介绍选择结构中的if语句,循环结构中的for循环。&&&& 1. if语句的基本语法结构有三种,分别如下: 1 if关系运算表达式 MATLAB语句 end 这种形式的选择结构表示,当关系运算表达式计算的结果为逻辑真的时候,执行MATLAB语句,这里的MATLAB语句也可以是多个MATLAB表达式。&&&& 2 if关系运算表达式 MATLAB语句A else MATLAB语句B end 这种形式的选择结构表示,当关系运算表达式的计算结果为逻辑真的时候,执行MATLAB语句A,否则执行MATLAB语句B。&&&& 3 if关系表达式a MATLAB语句A elseif关系运算表达式b MATLAB语句B else关系表达式c ?? end 这种选择结构可以判断多条关系运算表达式的计算结果,然后按照执行的逻辑关系执行相应的语句。&&&& 2. for语句构成循环的循环是最灵活、简洁的方法,不过使用for语句循环需要预先知道循环体执行的次数。&&&&在MATLAB中for循环的基本结构如下: 第5页 for indexstart:increment:end MATLAB语句 end 其中,index的取值取决于start和end的值,increment为步长,默认的数值为1。&&&& 和其他高级语言类似,MATLAB的循环结构也可以进行嵌套使用,在使用时需要注意for关键字和end关键字之间的配对使用。&&&& MATLAB自问世起,就以数值计算称雄。&&&&MATLAB进行数值计算的基本处理单位是复数数组,并且数组维数是自动按照规则确定的。&&&&这一方面使MATLAB 程序可以被高度“向量化”,另方面使用户易读易写。&&&& 比如已知t的采样数据是nm维数组,要计算5sin2teyt????。&&&&对一般的计算语言来说,必须采用两层循环才能得到结果,不但程序复杂,而且那些讨厌的循环十分费时。&&&&MATLAB处理这类则简洁快捷的多,只需直接了当的一条指令5sin.2exptty????,就可获得同样结果。&&&&这就是所谓的“数组运算”。&&&&这种运算在下面的分形图绘制过程中,将被频繁使用。&&&& 第6页 1973年,美籍法国数学家B.Mandelbrot在法兰西学院讲课时,首次提出了分维和分形几何的设想。&&&&分形(Fractal)一词,是Mandelbort教授创造出来的,其原意具有不规则、支离破碎等意义,分形几何学是一门以非规则几何形态为研究对象的几何学。&&&&由于不规则现象在自然界是普遍存在的,因此分形几何又称为描述大自然的几何学。&&&&分形几何建立以后,很快就引起了许多学科的关注,这是由于它不仅在理论上,而且在实用上都具有重要价值。&&&& 1 从整体上看,分形几何图形是处处不规则的。&&&&例如,海岸线和山川形状,从远距离观察,其形状是极不规则的。&&&& 2 在不同尺度上,图形的规则性又是相同的。&&&&上述的海岸线和山川形状,从近距离观察,其局部形状又和整体形态相似,它们从整体到局部,都是自相似的。&&&&当然,也有一些分形几何图形,它们并不完全是自相似的。&&&&其中一些是用来描述一般随即现象的,还有一些是用来描述混沌和非线性系统的。&&&& 据Mandelbort教授自己说,fractal一词是1975年夏天的一个寂静夜晚,他在冥思苦想之余偶翻他儿子的拉丁文字典时突然想到的。&&&&此词源于拉丁文形容词fractus,对应的拉丁文动词是frangere(破碎、产生无规碎片)。&&&&此外与英文的fraction(碎片、分数)及fragment(碎片)具有相同的词根。&&&&在70年代中期以前,Mandelbort一直使用英文fractional一词来表示他的分形思想。&&&&因此,取拉丁词之头,撷英文之尾的fractal,本意是不规则的、破碎 的、分数的。&&&&Mandelbort是想用此词来描述自然界中传统欧几里德几何学所不能描述的一大类复杂无规的几何对象。&&&&例如,弯弯曲曲的海岸线、起伏不平的山脉,粗糙不堪的断面,变幻无常的浮云,九曲回肠的河流,纵横交错的血管,令人眼花僚乱的满天繁星等。&&&&它们的特点是,极不规则或极不光滑。&&&&直观而粗略地说,这些对象都是分形。&&&& Mandelbort曾经为分形下过两个定义: 1 满足下式条件 dimAADim?? 的集合A,称为分形集。&&&&其中,DimA为集合A的Hausdoff维数(或分维数), dimA为其拓扑维数。&&&&一般说来,DimA不是整数,而是分数。&&&& 第7页 2 部分与整体以某种形式相似的形,称为分形。&&&& 然而,经过理论和应用的检验,人们发现这两个定义很难包括分形如此丰富的内容。&&&&实际上,对于什么是分形,到目前为止还不能给出一个确切的科学定义,正如生物学中对“生命”也没有严格明确的定义一样,人们通常是列出生命体的一系列特性来加以说明。&&&&对分形的定义也可同样的处理。&&&& a. 分形集都具有任意小尺度下的比例细节,或者说它具有精细的结构。&&&& b. 分形集不能用传统的几何语言来描述,它既不是满足某些条件的点的轨迹,也不是某些简单方程的解集。&&&& c. 分形集具有某种自相似形式,可能是近似的自相似或者统计的自相似。&&&& d. 一般,分形集的“分形维数”,严格大于它相应的拓扑维数。&&&& e. 在大多数令人感兴趣的情形下,分形集由非常简单的方法定义,可能以变换的迭代产生。&&&& 平面上决定一条直线或圆锥曲线只需数个条件。&&&&那么决定一片蕨叶需要多 少条件?如果把蕨叶看成是由线段拼合而咸,那么确定这片蕨叶的条件数相当 可现,然而当人们以分形的眼光来看这片蕨叶时,可以把它认为是一个简单的迭代函数的结果,而确定该系统所需的条件数相比之下要少得多.这说明用特定的分形拟合蕨叶比用折线拟合蕨叶更为有效。&&&& 分形观念的引入并非仅是一个描述手法上的改变,从根本上讲分形反映了自然界中某些规律性的东西,以植物为例,植物的生长是植物细胞按一定的遗传规律不断发育、分裂的过程,这种按规律分裂的过程可以近似地看做是递归、 迭代过程,这与分形的产生极为相似。&&&&在此意义上,人们可以认为一种植物对应一个迭代函数系统,人们甚至可以通过改变该系统中的某些参数来模拟植物的变异过程。&&&& 分形几何还被用于海岸线的描绘及海图制作、地震预报、图象编码理论、信号处理等领域,并在这些领域内取得了个人注目的成绩。&&&&作为多个学科的交叉,分形几何对以往欧氏几何不屑一顾(或说是无能为力)的“病态”曲线的全新解释是人类认识客体不断开拓的必然结果。&&&&当前,人们迫切需要一种能够更好地研究、描述各种复杂自然曲线的几何学:而分形几何恰好可以堪当此用。&&&&所以说,分形几何也就是自然几何,以分形或分形的组合的眼光来看待周围的物质世界就是自然几何观。&&&& 第8页 自从有了函数曲线的连续与可微性质及其关系以后,是否存在一个处处连续而点点不可微的函数曲线成了研究的热门。&&&&首先解决这个问题的是大数学家Weierstrass,他于1872年设计了如下的一个函数: ????????022coskkxbaxW?? 0.20.40.60.813456 图 3.1 Wx a0.5b3 Weierstrass证明了对某些a和b的值,该函数无处可微。&&&&1916年,Hardy证明了对满足上列条件的所有a和b的值,Wx都是无处可微的。&&&&Wx的缺点是极难绘图,顾不够直观。&&&& 到1904,瑞典数学家von Koch设计了一条被称之为Koch曲线的图形,起设计步骤如下:设E0为单位区间0,1,第一步,即n1,以E0的中间1/3线段为底,向上作一个等边三角形,然后去掉区间1/32/3,得一条4折线段的多边形E1。&&&&第二步,既n2,对E1的四条折线段重复上述过程,得到一条16折线段多边形E2。&&&&如图3.2 a b 图 3.2 von Koch曲线 不难想象,如果改变生成元如图 3.3 n0,便可导至另外的曲线,图3.3便是一例。&&&&利用这一生成元迭代的作下去,迭代步数记为n,可以得到图 第9页 3.3所示的结果。&&&&当n→∞时,生成的则是著名的Koch雪花。&&&& 假设生成元的顶点为p0、p1、p2、p3,其中p0p3,这样构成的等边三角形则是闭合的。&&&&我们现在用Pp0 p1 p2 p3来记录迭代过程中产生的新节点。&&&&首先由p0、p1计算出p2、p3,p4ptempTA。&&&&这里我们将ptemp分解为ptemp1和ptemp2。&&&&其中 ????????????????3/cos3/sin3/sin3/cos????????A 主要算法如下: 取点p000点p110 如果令Pp0p1,则有 p0P:ip1P:i1 下面由p0、p1计算其它点 p22p0/3p1/3p3p0/32p1/3 ptempp3-p2 p4ptemp1cospi/3-ptemp2sinpi/3 ptemp1sinpi/3ptemp2cospi/3p2 由下面的M语句完成对过程中产生的新节点的保护。&&&& Ptemp:flagp0 Ptemp:flag1p2 Ptemp:flag2p4 Ptemp:flag3p3 n0 n1 第10页 n2 n10 图 3.3 Koch曲线 如果改变变换矩阵中的旋转角度,将会产生另一张图形,见图3.4。&&&&这里我们将变换矩阵变为: ????????????????4/cos4/sin4/sin4/cos????????A 图 3.4 改变变换矩阵后的Koch雪花图 第11页 任意选定一个二维平面上的初始点坐标x0y0。&&&&假设我们可以生成一个在0,1区间上均匀分布的随机数??i,那么根据其取值的大小,可以按下面的公式生成一个新的坐标点x1y1。&&&& 11yx????????????????????????????????????????????????????????其它01.02.5.042.42.02.5.02/0101yyxxyxyyxxyxyyxxyyxiii?????? 令新生成的点x1y1为初始点x0y0,可以再生成一个新的点,我们可以多次重复这样的过程,这样就可以生成一族坐标点。&&&& 假设我们想根据这样的方式产生N个点,则可以由下面的MATLAB语句编写一个函数。&&&& function xyfrac_treex0y0vN xx0zerosN-11yy0zerosN-11 for i2:N vvvi if vvlt0.05 yi0.5yi-1 elseif vvlt0.45 xi0.42xi-1-yi-1yi0.20.42xi-1yi-1 elseif vvlt0.85 xi0.42xi-1yi-1yi0.2-0.42xi-1-yi-1 else xi0.1xi-1yi0.1yi-10.2 end end 调用此函数,我们可以由下面的MATLAB命令生成10000个这样的点,并将这些点在MATLAB图形窗口中用点的形式表示出来,如图4.2所示。&&&& gtgt N10000; vrandN1 xyfrac_tree00vN hplotx1:00’.’ gtgt seth’markersize’4 将markersize设置为5; 第12页 gtgt seth’markersize’5 markersize4 markersize5 图4.2 分形树 第13页 1980年,Mandelbort给世人提供了一幅无与伦比的杰作:Mandelbort集。&&&&其创作过程如下: 令??????2zz??C??z是复变量,??是复常数。&&&&从上述的复反馈过程得到如下迭代公式 ??pqnnzz??????21 5.1.1 式中z000,cpq为计算机荧屏位于pq位置的像素。&&&&于是上式成了 ????????pqpqpqpqnzz????????????????222201... 给定N为一个正整数。&&&&当像素位于pq且nN时nz仍然小于给定的一个值 K则在pq位置着色为1否则当nltN时已有nz??K则在pq位置描色为n。&&&&如此遍历屏幕后,便画出了一幅Mandelbort集。&&&& 在第二节中,我们将看到几幅Mandelbort图,它们具有多姿荆棘的圆盘,弯曲缠绕的螺线和细丝,挂着微细颗粒的鳞茎,无尽的斑斓色彩,意料外的精细结构,处处显示出分形奇特之美。&&&&20世纪80年代后,Mandelbort集被人们作为分形学的国籍标志出现在许多国际性论文集和刊物的封面上,成了世界巡回展出的计算机艺术精品。&&&&实际上,Mandelbort集和同样震惊世界的Julia集仅仅是映射??????2zz的无穷次迭代。&&&&这种由数学的内在美变成人们视觉上的美,简直是匪夷所思。&&&& 对于??????2zz,分离z及??的实部与虚部,记 iyxz????, iqp?????? 相应地,第k个点zk意味着xy平面上的点xkyk从zk到z1??k的迭代过程5.1.1就是 pyxxkkk????????221 qxyyk??????21 5.2.1 其中p和q在各步迭代中都保持为常数。&&&& 下面我们将介绍Mandelbort集算法的设计思想。&&&&我们假设显示器的分辨率是ab点。&&&&可显示的颜色为K1种。&&&& 选定??minp-2.25??maxp0.75??minq-1.5??maxq1.5M100。&&&&令 ????pappminmax??,bqqqminmax?????? 对所有点qpnn??pn12??a1及??qn12??b1完成如下循环 步骤1: pnqqpnppqp????????????????min0min0 0000??????yxk 第14页 步骤2: 用式5.2.1从kkyx得出11????kkyx计数k:k1 步骤3: 计算r22kkyx?? 如果rgtM则选择颜色k,转至步骤4 如果kK,则选择颜色0,转至步骤4 如果r??M,且kltK,转至步骤2 步骤4: 对点qpnn着颜色k,转至下一个点步骤1。&&&& 利用上面的过程,灵活地选取画面窗口,就可以观察到Mandelbort集的精细结构。&&&&在下面的程序中,用v1,v2,来决定一个平面,用offset来移动这个平面。&&&&图如5.1a
由v1、v2和offset来决定一个平面 v11 0 0 0 v20 1 0 0 offset0 0 0 0
p、q的起点、终点,决定画图的范围 pmin-2.25 pmax0.75qmin-1.50 qmax1.50
设收敛上界为100 M100
假设显示器的分辨率是ab点,则a、b便决定了图的精细度 a800 b600 delta_ppmax-pmin/a delta_qqmax-qmin/b
用a1b1零矩阵来记录每个发散的点 outzerosa1b1 for i1:a1 for j1:b1 upmini-1delta_p.v1qminj-1delta_q.v2offset n0 ku cu
矩阵的模ltM且由c定义的数列的前64项都ltM,则认为c由i、j决定收敛,n64,n越小收敛越快 wh.
【】【】【】【】【】matlab中的范数,是对矩阵的一个测度,我不太理解这句话,什么意思,_百度知道
matlab中的范数,是对矩阵的一个测度,我不太理解这句话,什么意思,
百度百科上的解释,不是很直观,有没有形象一点的解释
我有更好的答案
%X为向量,求欧几里德范数,即 。n = norm(X,inf) %求 -范数,即 。n = norm(X,1)
%求1-范数,即 。n = norm(X,-inf) %求向量X的元素的绝对值的最小值,即 。n = norm(X, p)
%求p-范数,即 ,所以norm(X,2) = norm(X)。命令 矩阵的范数函数 norm格式 n = norm(A)
%A为矩阵,求欧几里德范数 ,等于A的最大奇异值。n = norm(A,1) %求A的列范数 ,等于A的列向量的1-范数的最大值。n = norm(A,2) %求A的欧几里德范数 ,和norm(A)相同。n = norm(A,inf) %求行范数 ,等于A的行向量的1-范数的最大值即:max(sum(abs(A')))。n = norm(A, 'fro' ) %求矩阵A的Frobenius范数 ,矩阵元p阶范数估计需要自己编程求,计算公式如下 举个例子吧a=magic(3)sum(sum(abs(a)^4))^(1/4)a =
采纳率:19%
就和绝对值的意思类似
为您推荐:
其他类似问题
范数的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。求一个matlab里求内积的函数_百度知道
求一个matlab里求内积的函数
比如我要求X=[1 1 1 1 1]Y=[2;2;2;2;2]的内积求一个函数,可以调用的求X,Y的内积。
我有更好的答案
内积的命令是dot例子:x=[1 1 1 1 1 1];y=[2 2 2 2 2 2];dot(x,y)
采纳率:62%
为您推荐:
其他类似问题
内积的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。求一个计算矩阵常用三种范数的matlab程序_百度知道
求一个计算矩阵常用三种范数的matlab程序
我有更好的答案
函数 norm 格式 n = norm(X) %X为向量,求欧几里德范数,即 。 n = norm(X,inf) %求 -范数,即 。 n = norm(X,1) %求1-范数,即 。 n = norm(X,-inf) %求向量X的元素的绝对值的最小值,即 。 n = norm(X, p) %求p-范数,即 ,所以norm(X,2) = norm(X)。 命令 矩阵的范数 函数 norm 格式 n = norm(A) %A为矩阵,求欧几里德范数 ,等于A的最大奇异值。 n = norm(A,1) %求A的列范数 ,等于A的列向量的1-范数的最大值。 n = norm(A,2) %求A的欧几里德范数 ,和norm(A)相同。 n = norm(A,inf) %求行范数 ,等于A的行向量的1-范数的最大值 即:max(sum(abs(A')))。 n = norm(A, 'fro' ) %求矩阵A的Frobenius范数 ,矩阵元p阶范数估计需要自己编程求,计算公式如下 举个例子吧 a=magic(3) sum(sum(abs(a)^4))^(1/4) a = 8 1 6 3 5 7 4 9 2 ans = 19.7411 希望能帮上
为您推荐:
其他类似问题
范数的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: >>
MATLAB用法中矩阵简介
Matlab 用法中矩阵简介绪 论Matlab 是“Matrix Laboratory”的缩写,意为“矩阵实验室” ,是当今美国很流行的科学 计算软件.信息技术、计算机技术发展到今天,科学计算在各个领域得到了广泛的应用.在 许多诸如控制论、时间序列分析、系统仿真、图像信号处理等方面产生了大量的矩阵及其相 应的计算问题.自己去编写大量的繁复的计算程序,不仅会消耗大量的时间和精力,减缓工 作进程,而且往往质量不高.美国 Mathwork 软件公司推出的 Matlab 软件就是为了给人们 提供一个方便的数值计算平台而设计的. Matlab 是一个交互式的系统,它的基本运算单元是不需指定维数的矩阵,按照 IEEE 的 数值计算标准(能正确处理无穷数 Inf(Infinity) 、无定义数 NaN(not-a-number)及其运算)进 行计算.系统提供了大量的矩阵及其它运算函数,可以方便地进行一些很复杂的计算,而且 运算效率极高.Matlab 命令和数学中的符号、公式非常接近,可读性强,容易掌握,还可 利用它所提供的编程语言进行编程完成特定的工作.除基本部分外,Matlab 还根据各专门 领域中的特殊需要提供了许多可选的工具箱,如应用于自动控制领域的 Control System 工具 箱和神经网络中 Neural Network 工具箱等.第一节§1.1 Matlab 的安装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(求特征值的函 数)命令. 下面我们先从输入简单的矩阵开始掌握 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.1 4.8000 在括号中加注下标,可取出单独的矩阵元素.如: x(5)=abs(x(1)) 结果 x= -1.1 4..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 语句通常形式 为: 变量=表达式 或者使用其简单形式为: 表达式 表达式由操作符或其它特殊字符、函数和变量名组成.表达式的结果为一个矩阵,显示 在屏幕上,同时保存在变量中以留用.如果变量名和“=”省略,则具有 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 中数的表示方法和一般的编程语言没有区别.如: 3 -99 0.72 1..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 银行格式 format rat Approximation by ratio of small integers 有理数格式 format compact Suppress extra line-feeds 压缩格式 format loose Puts the extra line-feeds back in 自由格式 例如: x=[4/3 1.2345e-6] 在不同的输出格式下的结果为: 短格式 1.0 短格式 e 方式 1..234e-006 长格式 1.333 0.000 长格式 e 方式 1.333e-000 1.00e-006 有理数格式 4/3 1/ 进制格式 3ff5 3eb4b6231abfd271 +格式 + + 对于短格式, 如果矩阵的最大元素比数
大, 或者比数 0.0001 小, 则在打印时, 20 将加入一个普通的长度因数.如 y=1.e20*x,意为 x 被 10 乘,结果为: y= 1.0e+020* 1.0 “+”格式是显示大矩阵的一种紧凑方法, “+” , “-”和空格显示正数、负数和零元素. 最后 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 维向量也 不过是一个 1 × n 或 n × 1 的矩阵.从这个角度上来讲, Matlab 处理的所有的数据都是矩 阵.Matlab 的矩阵处理能力是非常灵活、强大的.以下我们将从矩阵的产生、基本运算、 矩阵函数等几个方面来说明. §2.1 向量及矩阵的生成除了我们在上节介绍的直接列出矩阵元素的输入方法,矩阵还可以通过几种不同的方式 输入到 Matlab 中. §2.1.1 通过语句和函数产生 1. 向量的产生 除了直接列出向量元素(即所谓的“穷举法” )外,最常用的用来产生相同增量的向量 的方法是利用“:”算符(即所谓的“描述法” ) .在 Matlab 中,它是一个很重要的字符.如: z=1:5 z= 1 2 3 4 5 即产生一个 1~5 的单位增量是 1 的行向量,此为默认情况. 用“:”号也可以产生单位增量不等于 1 的行向量,语法是把增量放在起始量和结尾量的 中间.如: x=0:pi/4:pi 即产生一个由 0~pi 的行向量,单位增量是 pi/4=3..7854. x= 0 0.8 2.6 也可以产生单位增量为负数的行向量.如: y=6:-1:1 y= 6 5 4 3 2 1 2. 矩阵的产生 Matlab 提供了一批产生矩阵的函数: zeros diag 产生一个零矩阵 产生一个对角矩阵 ones tril 生成全 1 矩阵 取一个矩阵的下三角 eye triu 生成单位矩阵 取一个矩阵的上三角 magic pascal 生成魔术方阵 生成 PASCAL 矩阵 例如: ones(3) ans = 1 1 1 1 1 1 1 1 1 eye(3) ans = 1 0 0 0 1 0 0 0 1 除了以上产生标准矩阵的函数外,Matlab 还提供了产生随机(向量)矩阵的函数 rand 和 randn, 及产生均匀级数的函数 linspace、 产生对数级数的函数 logspace 和产生网格的函数 meshgrid 等等.详细使用请查阅随机文档. “ : ”冒号可以用来产生简易的表格,为了产生纵向表格形式,首先用冒号“ : ”产 生行向量,再进行转置,计算函数值的列,然后形成有二列的矩阵.例如命令: x=(0.0:0.2:3.0)'; y=exp(-x).*sin(x); [x y] 产生结果为: ans = 0 0 0.7 0.0 0.9 0.0 1.0 1.0 2.0 2.0 2.00.6 0.0 0.0 0.6 0.3 0.0§2.1.2 通过后缀为.m 的命令文件产生 如有文件 data.m,其中包括正文: A=[ 1 2 3 456 7 8 0] 则用 data 命令执行 data.m,可以产生名为 A 的矩阵.§2.2 矩阵操作在 Matlab 中可以对矩阵进行任意操作,包括改变它的形式,取出子矩阵,扩充矩阵, 旋转矩阵等.其中最重要的操作符为“:” , 它的作用是取出选定的行与列. 例如: A(:,:) 代表 A 的所有元素;试比较 A(:), 将 A 按列的方向拉成长长的 1 列(向量) ; A(:,J) 代表 A 的第 J 列; A(J:K) 代表 A(J), A(J+1), …, A(K),如同 A(:)的第 J 到第 K 个元素; A(:,J:K) 代表 A(:,J), A(:,J+1), …, A(:,K),如此类推. 对矩阵可以进行各种各样的旋转、变形、扩充: Matlab 中有内部函数 fliplr ( Flip matrix in the left/right direction), 它对矩阵进行左右旋转. 例 x= 1 2 3 fliplr(x)为 3 2 1 4 5 6 6 5 4 同样有 flipud: x= 1 4 flipud(x)为 3 6 2 5 2 5 3 6 1 4 矩阵的转置用符号“ ' ”表示: 如 A=[1 2 3; 4 5 6 ; 7 8 0] 那么:计算 B=A' B= 1 4 7 2 5 8 3 6 0 符号“ ' ”为矩阵的转置,如果 Z 为复矩阵,则 Z'为它的复数共轭转置,非共轭转置使 用 Z.' 或 conj(Z')求得. reshape 改变矩阵的形状,这是什么意思呢?可举一个例子来说明. A=[A;[10 11 12]] A= 1 2 3 4 5 6 7 8 0 10 11 12 则 reshape(A,2,6) 1 7 2 8 3 0 4 10 5 11 6 12 可见, reshape 是将矩阵元素以列为单位进行重组, 原来 4×3 的矩阵变为了 2×6 的矩阵. 那 么以下的语句也不难理解了,它将矩阵 A 按列打开(size 函数返回矩阵 A 的行数与列数) . reshape(A,1,size(A,1)*size(A,2)),它等价于 A(:)' . 还有函数 rot90,它可以将矩阵进行各种 90 度的旋转;tril 及 triu 取出矩阵的下三角及上 三角阵等.详细的用法可以在需要使用时查阅手册.ans =第三节§3.1 加和减矩阵的基本运算如矩阵 A 和 B 的维数相同,则 A+B 与 A-B 表示矩阵 A 与 B 的和与差.如果矩阵 A 和 B 的维数不匹配,Matlab 会给出相应的错误提示信息.如: A= B= 1 2 3 1 4 7 4 5 6 2 5 8 7 8 0 3 6 0 C =A+B 返回: C= 2 6 10 6 10 14 10 14 0 如果运算对象是个标量(即 1×1 矩阵) ,可和其它矩阵进行加减运算.例如: x= -1 y=x-1= -2 0 -1 2 1§3.2 矩阵乘法Matlab 中的矩阵乘法有通常意义上的矩阵乘法,也有 Kronecker 乘法,以下分别介绍. §3.2.1 矩阵的普通乘法 矩阵乘法用“ * ”符号表示,当 A 矩阵列数与 B 矩阵的行数相等时,二者可以进行乘 法运算,否则是错误的.计算方法和线性代数中所介绍的完全相同. 如:A=[1 2 ; 3 4]; B=[5 6 ; 7 8]; C=A*B, 结果为 C= ? ?骣 1 2÷ 骣 5 ×? ÷ ? ÷ ? 3 4÷ ? 7 桫 桫6÷ 骣 1 5 2创7 1 6 + 2 8 ÷ 骣 19 22÷ ? = =? ÷ ÷ ÷ ? ? ÷ ÷ ÷ ?3 5 4创7 3 6 + 4 8÷ ? 8÷ 桫 43 50 ÷ 桫即 Matlab 返回: C= 19 22 43 50 如果 A 或 B 是标量,则 A*B 返回标量 A(或 B)乘上矩阵 B(或 A)的每一个元素所 得的矩阵. §3.2.2 矩阵的 Kronecker 乘法 对 n×m 阶矩阵 A 和 p×q 阶矩阵 B,A 和 B 的 Kronecher 乘法运算可定义为: 骣 a11B ? ? ? ?a21B C = A? B = ? ? ? ? ? ? ? ? an1B 桫a1m B ÷ ÷ ÷ a22 B ... a2 m B ÷ ÷ ÷ ÷ ? ? ? ÷ ÷ ÷ ÷ an 2 B ... anm B ÷ ...a12 B由上面的式子可以看出, Kronecker 乘积 A ? B 表示矩阵 A 的所有元素与 B 之间的乘积 组合而成的较大的矩阵,B ? A 则完全类似.A ? B 和 B ? A 均为 np×mq 矩阵,但一般情 况下 A ? B ? B ? A. 和普通矩阵的乘法不同, Kronecker 乘法并不要求两个被乘矩阵满足任 何维数匹配方面的要求.Kronecker 乘法的 Matlab 命令为 C=kron(A,B),例如给定两个矩阵 A 和 B: A= ? ?骣 骣 1 2÷ 1 3 2÷ ? ÷ ÷ B= ? ? ? ÷ ÷ 3 4÷ 2 4 6÷ 桫 桫则由以下命令可以求出 A 和 B 的 Kronecker 乘积 C: A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; C=kron(A,B) C= 1 3 2 2 6 4 2 4 6 4 8 12 3 9 6 4 12 8 6 12 18 8 16 24 作为比较,可以计算 B 和 A 的 Kronecker 乘积 D,可以看出 C、D 是不同的: A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; D=kron(B,A) D= 1 2 3 6 2 4 3 4 9 12 6 8 2 4 4 8 6 12 6 8 12 16 18 24§3.3 矩阵除法在 Matlab 中有两种矩阵除法符号: “\”即左除和“/”即右除.如果 A 矩阵是非奇异 方阵,则 A\B 是 A 的逆矩阵乘 B,即 inv(A)*B;而 B/A 是 B 乘 A 的逆矩阵,即 B*inv(A).具 体计算时可不用逆矩阵而直接计算. 通常: x=A\B 就是 A*x=B 的解; x=B/A 就是 x*A=B 的解. 当 B 与 A 矩阵行数相等可进行左除.如果 A 是方阵,用高斯消元法分解因数.解方程: A*x(:, j)=B(:, j),式中的(:, j)表示 B 矩阵的第 j 列,返回的结果 x 具有与 B 矩阵相同的阶数, 如果 A 是奇异矩阵将给出警告信息. 如果 A 矩阵不是方阵,可由以列为基准的 Householder 正交分解法分解,这种分解法可 以解决在最小二乘法中的欠定方程或超定方程, 结果是 m×n 的 x 矩阵. m 是 A 矩阵的列数, n 是 B 矩阵的列数.每个矩阵的列向量最多有 k 个非零元素,k 是 A 的有效秩. 右除 B/A 可由 B/A=(A'\B')'左除来实现.§3.4 矩阵乘方A^P 意思是 A 的 P 次方.如果 A 是一个方阵,P 是一个大于 1 的整数,则 A^P 表示 A 的 P 次幂,即 A 自乘 P 次.如果 P 不是整数,计算涉及到特征值和特征向量的问题,如已 经求得:[V,D]=eig(A),则: A^P=V*D.^P/V(注:这里的.^表示数组乘方,或点乘方,参见后面的有关介绍) 如果 B 是方阵, a 是标量,a^B 就是一个按特征值与特征向量的升幂排列的 B 次方程 阵. 如果 a 和 B 都是矩阵,则 a^B 是错误的. §3.5 矩阵的超越函数在 Matlab 中解释 exp(A) 和 sqrt(A) 时曾涉及到级数运算,此运算定义在 A 的单个元素 上. Matlab 可以计算矩阵的超越函数,如矩阵指数、矩阵对数等. 一个超越函数可以作为矩阵函数来解释,例如将“m”加在函数名的后边而成 expm(A) 和 sqrtm(A),当 Matlab 运行时,有下列三种函数定义: expm 矩阵指数 logm 矩阵对数 sqrtm 矩阵开方 所列各项可以加在多种 m 文件中或使用 funm. 请见应用库中 sqrtm.m, 1ogm.m, funm.m 文件和命令手册.§3.6 数组运算数组运算由线性代数的矩阵运算符“*” 、 “ /” 、 “\” 、 “^”前加一点来表示,即为“.*” 、 “./” 、 “.\” 、 “.^” .注意没有“.+” 、 “.-”运算. §3.6.1 数组的加和减 对于数组的加和减运算与矩阵运算相同,所以“+” 、 “-”既可被矩阵接受又可被数组接 受. §3.6.2 数组的乘和除 数组的乘用符号.*表示,如果 A 与 B 矩阵具有相同阶数,则 A.*B 表示 A 和 B 单个元素 之间的对应相乘.例如 x=[1 2 3]; y=[ 4 5 6]; 计算 z=x.*y 结果 z=4 10 18 数组的左除(.\)与数组的右除(./) ,由读者自行举例加以体会. §3.6.3 数组乘方 数组乘方用符号.^表示. 例如:键入: x=[ 1 2 3] y=[ 4 5 6] 则 z=x.^y=[1^4 2^5 3^6]=[1 32 729] (1) 如指数是个标量,例如 x.^2,x 同上,则: z=x.^2=[1^2 2^2 3^2]=[ 1 4 9] (2) 如底是标量,例如 2 .^[x y] ,x、y 同上,则: z=2 .^[x y]=[2^1 2^2 2^3 2^4 2^5 2^6]=[2 4 8 16 32 64] 从此例可以看出 Matlab 算法的微妙特性,虽然看上去与其它乘方没什么不同,但在 2 和“. ”之间的空格很重要,如果不这样做,解释程序会把“. ”看成是 2 的小数点. Matlab 看到符号“^”时,就会当做矩阵的幂来运算,这种情况就会出错,因为指数矩阵不是方阵.§3.7 矩阵函数Matlab 的数学能力大部分是从它的矩阵函数派生出来的,其中一部分装入 Matlab 本身 处理中, 它从外部的 Matlab 建立的 M 文件库中得到, 还有一些由个别的用户为其自己的特 殊的用途加进去的. 其它功能函数在求助程序或命令手册中都可找到. 手册中备有为 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.0 0 0.0 1.0 0 0 U= 7.0 0 0 0.0 0 0 4.5000 注:L 是下三角矩阵的置换,U 是上三角矩阵的正交变换,分解作如下运算,检测计算 结果只需计算 L*U 即可. 求逆由下式给出: x=inv(A) x= -1.9 -0.6 -0.2 -0.2 -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.3 0.0000 由于 A=L*U ,所以 x 也可以有以下两个式子计算:y=L\b,x=U\y.得到相同的 x 值, 中间值 y 为: y= 5.7 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.1 0.5 -0.2 -0.1 -0.4 -0.7 -0.4 0.1 R= -12.6 -16..6 0 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. x= 0..1667 我们得到了缺秩的警告.用 QR 分解法计算此方程组分二个步骤: y=Q'*b x=R\y 求出的 y 值为 y= -9.1 0.0 x 的结果为 Warning: Rank deficient, rank = 2 tol = 1. 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 求助.第四节§4.1 二维作图Matlab 中的图形绘图命令 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 是由计算机自动绘 出的.7 6 5 4 3 2 1 0 1 2 3 4 5 6图 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* y=sin(x); plot(x,y) grid on, title(' y=sin( x ) 曲线图' ) xlabel(' x = 0 : 0.05 : 4Pi ') 结果见下图.1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1y=sin( x ) 曲线图024x = 0 : 0.05 : 4Pi68101214图 4.1.1.2 y=sin(x)的图形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 六角星 如果你的计算机系统不支持彩色显示, Matlab 将把颜色符号解释为线型符号, 用不同的 线型表示不同的颜色.颜色与线型也可以一起给出,即同时指定曲线的颜色和线型. 例如: t=-3.14:0.2:3.14; x=sin(t); y=cos(t); plot(t,x, '+r',t,y, '-b')表 4.1.3.1 线型和颜色控制符 10.50-0.5-1 -4-2024图 4.1.3.1 不同线型、颜色的 sin,cos 图形§4.1.4 对数图、极坐标图及条形图 loglog、 semilogx、 semilogy 和 polar 的用法和 plot 相似. 这些命令允许数据在不同的 graph paper 上绘制,例如不同的坐标系统.先介绍的 fplot 是扩展来的可用于符号作图的函数. * fplot(fname,lims) 绘制 fname 指定的函数的图形. * polar( theta, rho) 使用相角 theta 为极坐标形式绘图,相应半径为 rho,其次可使用 grid 命令画出极坐标网格. * loglog 用 log10-log10 标度绘图. * semilogx 用半对数坐标绘图,x 轴是 log10,y 是线性的. * semilogy 用半对数坐标绘图,y 轴是 log10,x 是线性的. * bar(x) 显示 x 向量元素的条形图,bar 不接受多变量. * hist 绘制统计频率直方图. * histfit(data,nbins) 绘制统计直方图与其正态分布拟合曲线. fplot 函数的绘制区域为 lims=[xmin,xmax], 也可以用 lims=[xmin,xmax,ymin,ymax]指定 y 轴的区域.函数表达式可以是一个函数名,如 sin,tan 等;也可以是带上参数 x 的函数表达 式,如 sin(x),diric(x,10);也可以是一个用方括号括起的函数组,如[sin, cos]. 例 1:fplot('sin',[0 4*pi]) 例 2:fplot('sin(1 ./ x)', [0.01 0.1]) 例 3:fplot('abs(exp(-j*x*(0:9))*ones(10,1))',[0 2*pi],'-o') 例 4:fplot('[sin(x), cos(x) , tan(x)]',[-2*pi 2*pi -2*pi 2*pi]) %%(图 4.1.4.1)6 4 2 0 -2 -4 -60 10 3020-6-4-20246-10 -4 1010-2100102图 4.1.4.1 sin,cos,tan 函数图形图 4.1.4.2 半对数图下面介绍的是其它几个作图函数的应用. 例 5:半对数坐标绘图 t=0.001:0.002:20; y=5 + log(t) + semilogx(t,y, 'b') hold on semilogx(t,t+5, 'r') 例 6:极坐标绘图 t=0:0.01:2* polar(t,sin(6*t))%% (图 4.1.4.2)%% (图 4.1.4.3)图 4.1.4.3 极坐标绘图图 4.1.4.4 正态分布的统计直方图与其正态分布拟合曲线例 7:正态分布图 我们可以用命令 normrnd 生成符合正态分布的随机数. normrnd(u,v,m,n) 其中,u 表示生成随机数的期望,v 代表随机数的方差. 运行: a=normrnd(10,2,10000,1); histfit(a) %% (图 4.1.4.4) 我们可以得到正态分布的统计直方图与其正态分布拟合曲线. 例 8:比较正态分布(图 4.1.4.5(1) )与平均分布(图 4.1.4.5(2) )的分布图: yn=randn(30000,1); %% 正态分布 x=min(yn) : 0.2 : max(yn); subplot(121) hist(yn, x) yu=rand(30000,1); %% 平均分布 subplot(122) hist(yu, 25)00 00 800 600 400 500 200 0 -5 010000500.514.1.4.5(1)4.1.4.5(2)图 4.1.4.5 正态分布与平均分布的分布图§4.1.5 子图 在绘图过程中, 经常要把几个图形在同一个图形窗口中表现出来, 而不是简单地叠加 (例 如上面的例 8) .这就用到函数 subplot.其调用格式如下: subplot(m,n,p) subplot 函数把一个图形窗口分割成 m×n 个子区域, 用户可以通过参数 p 调用个各子绘 图区域进行操作.子绘图区域的编号为按行从左至右编号. 例 9:绘制子图 x=0:0.1*pi:2* subplot(2,2,1) plot(x,sin(x),'-*'); title('sin(x)'); subplot(2,2,2) plot(x,cos(x),'--o'); title('cos(x)'); subplot(2,2,3) plot(x,sin(2*x),'-.*'); title('sin(2x)'); subplot(2,2,4); plot(x,cos(3*x),':d') title('cos(3x)') 得到图形如下:1 0.5 sin(x) 1 0.5 cos(x)0 -0.50 -0.5-1024 sin(2x)68-1024 cos(3x)681 0.51 0.50 -0.50 -0.5-102468-102468图 4.1.5.1 子图§4.1.6 填充图 利用二维绘图函数 patch,我们可绘制填充图.绘制填充图的另一个函数为 fill. 下面的例子绘出了函数 humps(一个 Matlab 演示函数)在指定区域内的函数图形. 例 10:用函数 patch 绘制填充图 fplot('humps',[0,2],'b') hold on patch([0.5 0.5:0.02:1 1],[0 humps(0.5:0.02:1) 0],'r'); hold off title('A region under an interesting function.') grid 图 4.1.6.1 填充图我们还可以用函数 fill 来绘制类似的填充图. 例 11:用函数 fill 绘制填充图 x=0:pi/60:2* y=sin(x); x1=0:pi/60:1; y1=sin(x1); plot(x,y,'r'); hold on fill([x1 1],[y1 0],'g')图 4.1.6.2 填充图§4.2 三维作图§4.2.1 mesh(Z)语句 mesh(Z)语句可以给出矩阵 Z 元素的三维消隐图,网络表面由 Z 坐标点定义,与前面叙 述的 x-y 平面的线格相同,图形由邻近的点连接而成.它可用来显示用其它方式难以输出的 包含大量数据的大型矩阵,也可用来绘制 Z 变量函数. 显示两变量的函数 Z=f(x,y) ,第一步需产生特定的行和列的 x-y 矩阵.然后计算函数在 各网格点上的值.最后用 mesh 函数输出. 下面我们绘制 sin(r)/r 函数的图形.建立图形用以下方法: x=-8:.5:8; y=x'; x=ones(size(y))*x; y=y*ones(size(y))'; R=sqrt(x.^2+y.^2)+ z=sin(R)./R; mesh(z) %% 试运行 mesh(x,y,z),看看与 mesh(z)有什么不同之处? 各语句的意义是:首先建立行向量 x,列向量 y;然后按向量的长度建立 1-矩阵;用向 量乘以产生的 1-矩阵,生成网格矩阵,它们的值对应于 x-y 坐标平面;接下来计算各网格点 的半径;最后计算函数值矩阵 Z.用 mesh 函数即可以得到图形.第一条语句 x 的赋值为定义域, 在其上估计函数; 第三条语句建立一个重复行的 x 矩阵, 第四条语句产生 y 的响应,第五条语句产生矩阵 R(其元素为各网格点到原点的距离) .用 mesh 方法结果如上. 另外,上述命令系列中的前 4 行可用以下一条命令替代: [x, y]=meshgrid(-8:0.5:8) §4.2.2 与 mesh 相关的几个函数 (1) meshc 与函数 mesh 的调用方式相同,只是该函数在 mesh 的基础上又增加了绘制相 应等高线的功能.下面来看一个 meshc 的例子: [x,y]=meshgrid([-4:.5:4]); z=sqrt(x.^2+y.^2); meshc(z) %% 试运行 meshc(x,y,z),看看与 meshc(z)有什么不同之处? 我们可以得到图形:图 4.2.1 三维消隐图图 4.2.2.1 meshc 图地面上的圆圈就是上面图形的等高线. (2) 函数 meshz 与 mesh 的调用方式也相同, 不同的是该函数在 mesh 函数的作用之上增 加了屏蔽作用,即增加了边界面屏蔽.例如: [x,y]=meshgrid([-4:.5:4]); z=sqrt(x.^2+y.^2); meshz(z) %% 我们得到图形:试运行 meshz(x,y,z),看看与 meshz(z)有什么不同之处?图 4.2.2.2 meshz 图§4.2.3 其它的几个三维绘图函数 (1) 在 Matlab 中有一个专门绘制圆球体的函数 sphere,其调用格式如下: [x,y,z]=sphere(n) 此函数生成三个(n+1)×(n+1)阶的矩阵,再利用函数 surf(x,y,z)可生成单位球面. [x,y,z]=sphere 此形式使用了默认值 n=20 sphere(n) 只绘制球面图,不返回值. 运行下面程序: sphere(30); 我们得到球体图形:图 4.2.3.1 球面图若只输入 sphere 画图,则是默认了 n=20 的情况. (2) surf 函数也是 Matlab 中常用的三维绘图函数.其调用格式如下: surf(x,y,z,c) 输入参数的设置与 mesh 相同,不同的是 mesh 函数绘制的是一网格图,而 surf 绘制的 是着色的三维表面.Matlab 语言对表面进行着色的方法是,在得到相应网格后,对每一网 格依据该网格所代表的节点的色值(由变量 c 控制) ,来定义这一网格的颜色.若不输入 c, 则默认为 c=z. 我们看下面的例子: %绘制地球表面的气温分布示意图. [a,b,c]=sphere(40); t=abs(c); %求绝对值 surf(a,b,c,t); axis equal colormap('hot') 我们可以得到图形如下:图 4.2.3.2 等温线示意图§4.2.4 图形的控制与修饰 (1) 坐标轴的控制函数 axis,调用格式如下: axis([xmin,xmax,ymin,ymax,zmin,zmax]) 用此命令可以控制坐标轴的范围. 与 axis 相关的几条常用命令还有: axis auto 自动模式,使得图形的坐标范围满足图中一切图元素 axis equal 严格控制各坐标的分度使其相等 axis square 使绘图区为正方形 axis on 恢复对坐标轴的一切设置 axis off 取消对坐标轴的一切设置 axis manual 以当前的坐标限制图形的绘制 (2)grid on 在图形中绘制坐标网格. grid off 取消坐标网格. (3)xlabel, ylabel, zlabel 分别为 x 轴, y 轴, z 轴添加标注.title 为图形添加标题. 以上函数的调用格式大同小异,我们以 xlabel 为例进行介绍: xlabel('标注文本','属性 1','属性值 1','属性 2','属性值 2',…) 这里的属性是标注文本的属性,包括字体大小、字体名、字体粗细等. 例如: [x, y]=meshgrid(-4:.2:4); R=sqrt(x.^2+y.^2); z=-cos(R); mesh(x,y,z) xlabel('x\in[-4,4]','fontweight','bold'); ylabel('y\in[-4,4]','fontweight','bold'); zlabel('z=-cos(sqrt(x^2+y^2))','fontweight','bold'); title('旋转曲面','fontsize',15,'fontweight','bold','fontname','隶书');图 4.2.4.1 添加标注以上各种绘图方法的详细用法,请看联机信息.§4.3 统计回归图对平面上 n 个点: ( x1 , y1 ), ( x2 , y2 ), ?, ( x n , y n ), 在平面直线族{ y ? a ? bx | a , b 为实数}中寻求一条直线 y ? a 0 ? b0 x ,使得散点到与散 点相对应的在直线上的点之间的纵坐标的误差的平方和最小,用微积分的方法可得:b0 =n邋xi yi - ( n邋x - (2 ixi )( xi )xi n2yi )邋x=iyin n 2 骣 x 邋 ÷ i ? ÷ ? ÷? ? 桫n ÷-xi yi n xi2 na0 =邋y - bin0= y - b0 x所求得的这条直线: y ? a 0 ? b0 x 称为回归直线. 例:已知如下点列,求其回归直线,并计算最小误差平方和.x 0.1 y 420.11 .12 43.5 45.13 .14 45.5 45.15 .16 47.5 49.17 53.18 50.2 55.21 55.23 60参考的程序如下: x=[0.1 0.11 .12 .13 .14 .15 .16 .17 .18 .2 .21 .23]; y=[42 43.5 45 45.5 45 47.5 49 53 50 55 55 60]; n=length(x); xb=mean(x); yb=mean(y); x2b=sum(x.^2)/n; xyb=x*y'/n; b=(xb*yb-xyb)/(xb^2-x2b); a=yb-b* y1=a+b.*x; plot(x,y,'*',x,y1); serror=sum((y-y1).^2)图 4.3.1 回归直线第五节§5.1 关系运算Matlab 编程§5.1.1 比较运算 比较两个同阶矩阵有下面六种相关操作符: 相关操作符 & 小于 &= 小于等于 & 大于 &= 大于等于 == 等于 ~= 不等于 比较两个元素的大小,结果是“1”表明为真,结果是“0”表明为假. 例如 2+2~=4 结果是“0” ,表明为假. 例如一个 6 阶魔术方阵,矩阵元素计算满足各种条件: A=magic(6) ans =表 5.1.1.1 相关操作符 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 阶数为 n 的魔术方阵,即 n×n 矩阵,是由 1~n2 的整数组成(n=6).仔细观察这个矩阵, 我们会发现任何行和、任何列和都相等.另外,每个 3×3 子行列式的对角线元素和,都可 被 3 整除.为了显示这一特性,键入: p=(rem(A,3)==0) p= 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 为了再仔细地观察这个模式,可以用 format+格式画出矩阵的压缩格式.此格式用“+” 代表正元素, “-”代表负元素,空格代表 0. format + p= + + + + + + + + + + + + find 函数在关系运算中很有用,它可以在 0-1 矩阵中找非零元素的下标. 若 y 是一个向量,例如:y=[1 3 2 4 3.5 2.9],则 find(y&3.0),将指出 y 的 分量在哪些位置上小于 3.0. ans = 1 3 6 即:向量 y 的第 1、3、6 位置上的元素小于 3.0. 当输入 x==NaN 时结果为 NaN,因为按照 IEEE 算法规定任何具有 NaN 的操作,结果都 是 NaN.调试 NaN 很有用,例如测试 x,输入 isnan(x)函数,如果 x 元素是不定值则得 1, 否则得 0.isfinite(x)更有用,如-?&x&?时则得 1. §5.1.2 逻辑运算 & | ~与 或 非表 5.1.2.1 逻辑运算符“&”和“|”操作符可比较两个标量或两个同阶矩阵.对于矩阵来说必须符合规则,如 果 A 和 B 都是 0-1 矩阵,则 A&B 或 A|B 也都是 0-1 矩阵,这个 0-1 矩阵的元素是 A 和 B 对应元素之间逻辑运算的结果,逻辑操作符认定任何非零元素都为真,给出“1” ,任何零元 素都为假,给出“0” . 非(或逻辑非)是一元操作符,即~A:当 A 是非零时结果为“0” ;当 A 为“0”时,结果 为“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) enddo something§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)是可行的. 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 &3n+1&problem from number theory 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 这个过程能永远进行吗? 程序的说明: (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 文件称为命令文件,它是一系列命令、语句的简单组合. 第二类型的 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) [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)* 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 表明 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) 清晰的元素表输入: 如果你有少量数据,比如说小于 10~15 个元素,使用方括号[]输入. (2) 使用文本编辑建立命令文件,将数据列为清晰的元素表输入.如果数据不是可读形 式,又不得不以一种方法键入,可以重复运行 M 文件,重复修改数据. (3) 如果数据以 ASCII 形式存贮,并有固定长度,行尾有回车符,各数间有空格的文件 称为 flat file(ASCII 的 flat file 可由普通文本编辑来编辑 ) , flat file 通过 load 命令直接读进 Matlab,结果存入名为文件名的变量中去. (4) 将数据文件译成 Matlab 文件形式,使用 load 命令,translate 程序由 Matlab 中的应 用程序库支持,translate 程序将 ASCII 文件、二进制文件、FORTRAN 非格式文件和 DIF 文 件转换为 Matlab 使用的特定的 MAT 文件,当磁盘文件中存有大量数据时,这个方法输入 最好. Matlab 数据输出到外部世界的方法: (1) 小矩阵时:使用 diary 命令建立日志文件,在文件中列出变量,用文本编辑处理日志 文件,日志的输出包括运行中的 Matlab 命令. (2) 使用 save 命令存入变量,退出 Matlab,用 translate 程序将 MAT 文件转换成任一种 其它文件形式.第六节Matlab 符号运算Matlab 本身并没有符号计算功能,1993 年通过购买 Maple 的使用权后,开始具备符号 运算的功能.符号运算的类型很多,几乎涉及数学的所有分支.§6.1 Matlab 符号运算的工作流程§6.1.1 工作过程§6.1.2 核心工具 sym 函数 VS syms 语句 sym 函数:构造符号变量和表达式: a=sym('a') (Construct symbolic numbers, variables and objects) syms 语句:构造符号对象的简捷方式(Short-cut for constructing symbolic objects) §6.1.3 符号变量确定原则 (1)除了 i 和 j 之外,字母位置最接近 x 的字母;若距离相等,则取 ASCII 码大的; (2)若没有除了 i 与 j 以外的字母,则视 x 为默认的符号变量; (3)可利用函数 findsym(string,N)来询问在众多符号中,哪 N 个为符号变量.例如:键 入 findsym(3*a*b+y^2,1),即可得到答案 y.更多的例子见下表: 符号表达式 a*x^2+b*x+c 1/(4+cos(t)) 4*x/y 2*a+b 2*i 默认符号变量 x t x b x§6.2Matlab 的六大常见符号运算§6.2.1 因式分解 syms x f=x^6+1; s=factor(f) 结果为: s=(x^2+1)*(x^4-x^2+1) §6.2.2 计算极限 求极限: (1) L ? limh ?0ln( x ? h) ? ln( x) , h x n ) n%%单引号可省略掉(2) M ? lim (1 ?n ??syms h n x L=limit('(log(x+h)-log(x))/h',h,0) M=limit('(1-x/n)^n',n,inf) 结果为: L =1/x M =exp(-x) §6.2.3 计算导数y ? sin ax , 求 A ?dy dy d2 y ,B ? ,C ? dx da d x2 . y=sin(a*x); A=diff(y,x) B=diff(y,a) C=diff(y,x,2) 结果为: A = cos(a*x)*a B = cos(a*x)*x C = -sin(a*x)*a^2 §6.2.4 计算不定积分、定积分、反常积分x2 ? 1 dx ( x2 ? 2x ? 2 ) 2 , ?/2 cos x J? dx sin x ? cos x 0 , I???K?. syms x f=(x^2+1)/(x^2-2*x+2)^2; g=cos(x)/(sin(x)+cos(x)); h=exp(-x^2); I=int(f) J=int(g,0,pi/2) K=int(h,0,inf) 结果为: I =1/4*(2*x-6)/(x^2-2*x+2)+3/2*atan(x-1) J =1/4*pi K =1/2*pi^(1/2) §6.2.5 符号求和 求级数?0??e ? x dx2?nn ?1?12的和 S, 以及前十项的部分和 S1.syms n S=symsum(1/n^2, 1, inf) S1=symsum(1/n^2,1,10) 结果为: S =1/6*pi^2 S1 =0080?重要说明:当求函数项级数?nn ?1x2的和 S2 时,可用命令:syms n x S2=symsum(x/n^2, n, 1, inf) S2 =1/6*x*pi^2 两点说明: (1)注意观察 S2 与 S1 的细微区别! (2)当通项公式的 Matlab 表达式较长时,表达式要加上单引号.后面的练习中会遇到 此问题. §6.2.6 解代数方程和常微分方程 利用符号表达式解代数方程所需要的函数为 solve(f),即解符号方程式 f. 例如:求一元二次方程 a*x^2+b*x+c=0 的根. f=sym('a*x^2+b*x+c') 或 f='a*x^2+b*x+c' solve(f) ans= [1/2/a*(-b+(b^2-4*c*a)^(1/2))] [1/2/a*(-b-(b^2-4*c*a)^(1/2))] solve(f, a) ans= -(b*x+c)/x^2 利用符号表达式可求解微分方程的解析解,所需要的函数为 dsolve(f),使用格式: dsolve('equation1', ' equation2', …) 其中: equation 为方程或条件. 写方程或条件时, 用 Dy 表示 y 关于自变量的一阶导数, 用 D2y 表示 y 关于自变量的二阶导数,依此类推. 1. 求微分方程 y ' ? x 的通解. syms x y %定义 x,y 为符号 dsolve('Dy=x', 'x') ans = 1/2*x^2+C1 试比较: 若写成: syms x y %定义 x,y 为符号 dsolve('Dy=x') 结果将是什么?是否正确?为什么? 2. 求微分方程 ? ísyms x y dsolve('D2y=x+Dy', 'y(0)=1', 'Dy(0)=0', 'x') ans = -1/2*x^2+exp(x)-x 试比较: 若写成: syms x y dsolve('D2y=x+Dy', 'y(0)=1', 'Dy(0)=0')ì ?y& = x + y ' 的特解. ? ? ? y (0) = 1, y '(0) = 0 结果将是什么?是否正确?为什么? 3. 求微分方程组 ? ísyms x y [x,y]=dsolve('Dx=y+x, Dy=2*x') x= 1/3*C1*exp(-t)+2/3*C1*exp(2*t)+1/3*C2*exp(2*t)-1/3*C2*exp(-t) y= 2/3*C1*exp(2*t)-2/3*C1*exp(-t)+2/3*C2*exp(-t)+1/3*C2*exp(2*t) 试比较: 若写成: (1) dsolve('Dx=y+x, Dy=2*x') 结果将是: ans = x: [1x1 sym] y: [1x1 sym] 试解释此结果的含义. 若写成: (2) [x,y]=dsolve('Dx=y+x, Dy=2x') 结果将是: x= exp(t)*C1+C2*exp(t)-C2-2-2*t y= C2+2*t 是否正确?为什么?ìx ' = y + x ? 的通解. ? ? ? y ' = 2x
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 matlab 距离矩阵 的文章

 

随机推荐