3简单程序没计 方程的不同的解。在上面的语句中,函数od23用于对由函数M文件 lotka,m定义的常微 分方程进行数值求解 1.3.4程序设计中应注意的几个问题 MATLAB的程序设计是很简单的,普通的M文件可以作为主程序,在其中可以调用 任何 MATLAB系统提供的函数和用户自己定义的函数M文件。为了使用户能够对程序的 执行进行控制, MATLAB提供了几个特殊的函数 通常在执行一个M文件时, MATLAB不显示M文件中的语句,使用 MATLAB的 echo命令可以改变这种状态。这在进行程序的设计和调试时是很有用的。在M文件中可以 通过加入echo命令,使其后的语句在执行时在命令窗口中显示出来,而 echo off命令则是 关掉显示状态。 函数 Input用于获得用户的键盘输入,例如 》 input( How many apples') 以字符串 How many apples'为提示符,等待用户的输入,并将用户从键盘上输入的数据或 表达式赋给变量n。函数 Input的一个用处是设计菜单式程序,详见 MATLAB的demo程 序中的例子 另一个比 Input更有效的输入函数是 keyboard,这个函数使得键盘就像一个普通M文 件一样,将其置入M文件中对程序或函数的设计和调试很有帮助。 MATLAB的 pause命令的作用是使程序暂时停下,直至用户按下任何键后再运行,而 pause(n)则是使程序暂停n秒钟后再继续执行 MATLAB的内部向量与矩阵运算的速度远比 MATLAB的编译解释的速度要快,这 意味着,为了加速 MATLAB的运行速度,在程序设计中要尽可能地使用向量或矩阵化的算 法特别是要将for和 while等循环语句尽可能地转换成向量或矩阵的运算例如,为了计算 从1到10之间的1001个点的正弦函数值通常的方法是采用下列语句 0l:10 i=i+1; y(i)=sin(t) 如果按照向量化的算法,相同的结果可以由下列语句组得出 t=0:.01;10; sin(t) 在一台速度较慢的PC386计算机上,前一组语句所需要的时间大约是15秒而第二组 语句仅需要大约06秒。如何将一段复杂的程序转换成向量或矩阵化的运算是一个复杂的 同题,但是在程序设计中要尽可能地使用向量或矩阵化的运算 另一种加快程序执行速度的方法是为将要使用的向量或矩阵变量预先分配内存空间。 例如
第一章 MATLAB系统与语言微介 y=ros(1,100) 在这组语句中,第一条语句首先创建一个有100个元素的行向量,各元素的值都为零 然后,for循环语句对向量y的分量重新斌值如果在这个例子中取消语句组中的第一条语 句y=ones(1,100),那么 MATLAB将要使用较长的时间来生成向量y。因为在进入for 循环体之前,变量y不存在,执行第一次循环时,i=1,首先创建变量y(1),即1×1的矩阵 向)。以后,每执行一次循环 MATLAB就要重新为向量y增加一个新的元素如果预先 定义了向量y,这个步骤就会省略,从而加快了程序的执行速度。 对于要在内存资源有限的计算机上使用大型数据矩阵的用户来说,预先创建矩阵变量 的方法还有第二个优点,即可以更有效地使用存空间。这是因为在 MATLAB系统的管理 下,内存空间在逐步趋于碎片化,经过一段时间的运行后,虽然还剩下许多内存空间,但是可 能没有足够的连续空间用于存放大型的矩阵变量。预先分配内存空间的方法可以减少内存 碎片化的可能性 前面已经介绍过,使用who命令可以用来报告所剩的内存空间。如果再从工作环境中 清除一个变量,who命令指出的可用内存数可能没有改变,除非这个变量是工作环境中最 大的变量。这是因为指示的内存量是内存中尚未使用的连续内存片的数量,清除最大的变量 可以增加这个内存指示量,而清除其他的变量不一定能使这个内存量增加,这意味着可能有 更多的内存可以使用 在编写 MATLAB程序时,知道一点 MATLAB的优化技术是很有帮助的。 MATLAB 函数在传递输入参数时,如果在函数体内没有语句对该参数重新赋值那么 MATLAB就不 在函数层的工作环境中生成这个参数的拷贝值。这就意味着只要不在函数内部改变输入参 数的值,则在传递一个大型的参数数据给函数时,就不会存在内存上的障碍 1.4矩阵运算与数组运算 MATLAB可以对矩阵的行、列单个的元素以及矩阵的子块进行控制和管理。一个数 值向量可以用作矩阵的角标,达到访问某些矩阵元素的目的利用向量和角标的灵活表达方 式,可以对矩阵的元素进行有效的访问与管理 1.4.1矩阵的创建函数 1.创建向量对象 冒号“:”在 MATLAB中是一个很重要的运算符,它可以用来创建向量对象。例如语句 表示创建一个行向量对象x,其元素是从1到5的五个整数,在 MATLAB命令窗口中,它 的输出是
1.4矩阵运算与数组运算 在上述调用形式中,增量为1。也可以用任意大小的数为增量,甚至可以是负数。例如 z=6:-1: 生成的结果是 0.00000.78541.57082.35623.1416 冒号运算符使得数据向量的创建变得十分容易。为了得到一个竖型的函数数据表,只需 先用冒号运算符生成行向量,再转置,计算出函数值列就可用两列数据拼成一个函数数据 表。例如: 》x=(0.0:0.2:3.0)’; y=exp(一x),.*sin(x); 计算的结果是 0.00000.0000 0.20000.1627 2610 0.60000.3099 0.80000.3223 1.00000.3096 1.20000.2807 1.40000.2430 0.2018 0.1231 2.20 2.40000.0613 2.6000 38 0204 3.00000.0070 能够创建向量的其他函数还有: logspace函数,用于创建对数等距的向量; linspace函 数,用于创建指定长度的等距向量。例如 >>k=linspace(-pi, pi, 4) 计算的结果为
第一章 MATLAB系统与语言简介 3.1416 1.0472 04723.1416 2.创建特殊矩阵 MATLAB提供了一类函数,用于创建某些特殊类型矩阵这些函数主要包括有: compan 多项式的伴随矩阵 d i 向量的对角矩阵 gallery 检验矩阵 hadamard Hadamard矩阵 hankel Hankel矩阵 hilb bert矩阵 逆 Hilbert矩阵 Kronecker张量积 幻方矩阵 杨辉三角形矩阵 Toeplitz矩阵 vander Vandermonde矩阵 例如,为了求得多项式x2-7x+6的伴随矩阵,首先,应根据 MATLAB中多项式的表 达方式,把多项式表示成一个向量,其元素为多项式的系数按最高次系数到最低次系数的 顺序排列然后将函数 compan作用在这个向量上 100 矩阵A的特征值是这个多项式的根,即 eig (A) 1.0000 又如,由两个向量决定的 Toeplitz矩阵可以按下列方式得到 [12345]; [1.52.53.54.55.6]; 002.5003.5004.500 2.0001.0002.5003.5004.500
1.4矩阵运算与数组运算 31 3.0002.0001.0002,5003.500 4.0003.0002.0001.0002.500 5.0004.0003.0002.0001.000 另一些创建特殊矩阵的 MATLAB函数有: zeros 元素全为零的矩阵 ones 元素全为1的矩阵 元素为一致分布的随机矩阵 ra 元素为正态分布的随机矩阵 单位矩阵 线性等距向量 对数等距向量 meshgrid 用于二元函数,参见图形功能一章 例如,为了创建一个4×3的随机矩阵,只需输入下列语句: 》A=rand(4,3) A 0.21130. 0.4832 0.08240.84740.6135 0.75990.45240.2749 0.00870.80750.8807 1.4.2矩阵的角标 1.角标的定义与矩阵子块的表示 矩阵是二维的,为了标记矩阵的每个元素的位置数学上该元素在矩阵中的行、列标 号来表示 MATLAB也使用类似的方法来表示,并将行列标号称为角标。例如,A(3,4)是矩 阵A的第三行第四列的元素这里3和4被称为矩阵A的角标矩阵的角标可以是表达式, MATLAB将表达式之值截断成最邻近的整数矩阵变量名与角标一起就决定了矩阵的元 素及其位置。例如,给定矩阵A如下: 23 147 56 那么,下面的语句 A(3,3)=A(1,3)+A(3,1) 将更新矩阵A的第三行第三列元素的值,运算的结果为 A 23