第一章 MATLAB系统与语言简介 MATLAB约定矩阵的角标可以是一个向量。如果x和v都是长度为n的向量,那么 x(v)表示新的向量[x(v(1),x(v(2),…,x(v(n))]。对矩阵来说,可以利用向量角标访 问矩阵的子矩阵。例如设A是一个10×10的矩阵,那么语句 A(1:5,3) 表示创建一个5×1的列向量由矩阵A的第三列前5个元素组成又如语句 A(1:5,7:10) 表示创建一个新的5×4阶矩阵由矩阵A的前五行后四列的元素组成,即为A的一个子 块。在这种表示方法中,单用冒号作角标时,表示该矩阵的全部行或全部列。例如,语句 》A(:,3) 表示矩阵A的第三列,而 A(1:5,:) 表示矩阵A的前五行 矩阵的角标表示可以用在赋值语句中,这是矩阵运算的一种技巧。例如语句 A(:,[3510])=B(:,1:3) 表示将矩阵A的第三列第五列和第十列分别用矩阵B的前三列代替 般地,如果ν和w都是整数元素向量,那么A(v,w)表示的是一个取自A的矩阵子 块其行由向量ⅴ确定,而列由向量w确定,称v为行角标,w为列角标。这样, 表示矩阵A的列反序的矩阵。另一种十分有效的表示是A(:),如果A(:)在赋值语句的 右端,表示由矩阵A的元素按列的顺序排成的列向量。例如,语句 A=[12;34;56] 》b=A(:) 的输出结果是 A 2345 如果A(:)出现在赋值语句的左端表示用一个向量对矩阵A进行赋值,此时矩阵A 必须事先存在。例如,设A是上述的3×2阶的矩阵那么语句
1.4矩阵运算与数组运算 行向量(11,12,13,14,15,16)的6个元素依照矩阵A的列顺序给A的元素赋值,但保持矩 阵A的维数3×2,因此 MATLAB的函数 reshape正是使用这种方法来改变一个矩阵的维数的。一般说来,矩 阵的角标出现在语句等号的右端时,表示创建一个新的矩阵对象;在左端时,则表示对原矩 阵中的部分或全部元素重新赋值。 2.矩阵的0-1角标 在 MATLAB中,可以使用0-1向量作为矩阵的角标向量。这样就可以用关系运算的结 果来引用矩阵的元素或子块,这在一些数学计算中是十分有意义的。假设A是一个m×n 阶矩阵,L是一个长度为m的0-1向量,那么A(L,:)表示由向量L的非零元素对应的矩 阵A的行组成的子块。下面的语句可以用来消去向量x中大于0.03的元素 x=x(x<=0.03) 类似地, L=X(:,3)>100 X=X(L,;) 表示用原矩阵X的第三列中值大于100的元素所在行组成的子块矩阵去代换矩阵X即赋 值给变量X 3空矩阵及其应用 MATLAB定义了一个很特殊的矩阵即空矩阵。空矩阵可以由下列的语句创建: 》x=[ 将一个0X0阶的矩阵赋给变量x,随后即可以应用这个空矩阵变量,而不会导致错误。空 矩阵语句的作用是传播空矩阵,它与 MATLAB的清除变量的命令 是不相同的, clear x是从工作环境中清除变量x,清除之后,再引用变量x是非法的。而空 矩阵变量是一个存在于工作环境中的特殊变量,它的维数为0×0,无任何元素,可以用 exist函数检测该变量的存在性。函数 Isempty则可以用来检测某个变量是否为空矩阵。 除了空矩阵外还有空向量。如果n比1小,邦么向量1:n就是无任何元素的空向量 空向量也是空矩阵。 最为重要的一点是,利用空矩阵的特性,可以进行从一个矩阵中消去部分行和部分列的 运算。例如,语句 的运算结果是从矩阵A中消去第2列和第4列的矩阵子块。 在 MATLAB中,某些 MATLAB函数用空矩阵作变量时,被赋予了特定的值。这些函 数包括det(矩阵行列式的值)、cond(矩阵的条件数)、prod(各列元素之积)和sum(各列 素之和)。例如,如果x是一个空矩阵,则分别规定det(x)=l,prod(x)=1和sum(x)=0
34 第一章 MATlAB系统与语言简介 等 4.3矩阵与数组运算 1.矩阵的算术运算与关系运算 在本书12.3节中,已经介绍了矩阵的算术运算和关系运算这里简单介绍大矩阵的构 造方法。与数学运算一样 MATLAB可以由小矩阵作为短阵子块来构造大矩阵。例如,如果 A是n阶方阵那么,语句 >C=LAA; ones(size(A))A. 2]: 表示创建一个2n阶的方阵。在这样的运算中,要保持矩阵阶数的协调性,否则 MATLAB系 统会报告运算出错 MATLAB提供了一个特殊函数NN(Not- A-Number的缩写),它的作用是创建一个 对象。该对象表示的不是数学意义下的任何数值对象通常NaN可以由未定义的表达式0 按照IEEE浮点运算的标准建立。用户可以用NaN表示一些不可使用的数据(Not Available Data)。 正确地掌握不可使用的数据是一个较困难的间题,在不同的场合其意义不同。 MATLAB为此提供了统一管理NaN的方法,使它自然地在运算过程中传播。因此在任何 计算过程中,只要使用了NaN,那么最终的计算结果就是NaN,除非计算结果不依赖于 NaN的值 MATLAB函数 Ishan用于检验某些变量是否是NaN。例如,在向量x中,其值为NaN 的元素在向量中的位置是 >ii- find (isnan (x)); 其中,函数find的作用是返回向量x中非零元素的角标值。又如,由下列语句 >x x(find (isnan(x))) 可使返回的数据中不再包含有以NaN为值的元素。另外,下列语句可以达到同样的目的 》x=x(~ Isnan(x)) 或 》x( dInan(x)=[ 上述的第二种方法是最为直接的但是下面的语句却不能达到这样的目的 》x(x==NaN)=[]; 因为,关系运算x==NaN的结果仍是NaN,所以角标x(NN)是没有意义的。如果要从一 个矩阵中去掉含有NaN值的行,可以由下列语句来实现: 》x(any( Finnan(x)’,:)=[]; 2.矩阵的管理 为了实现由一个矩阵创建新的矩阵,以及对矩阵的运算进行管理, MATLAB提供了 些功能函数,主要包括有: 将矩阵旋转90度 将矩阵的列反序(左右反序
4矩阵运算与数组运算 fliud 将矩阵的行反序(上下反序) 提取矩阵的对角元素形成对角矩阵或将一个向量转换成对角矩阵 提取矩阵的下三角部分 提取矩阵的上三角部分 reshape 改变矩阵阶数 例如,当要将一个3×4阶矩阵按照列的顺序重排成2×6的矩阵时,可以用下列的语句 来实现: A=[14710;25811;36912]; >>B= reshape(A, 2, 1357911 24681012 又如,A的下三角矩阵可以由下列语句得到 056 与矩阵运算相关的另外两个 MATLAB函数是sie和 length。函数sie(A)的返回值是 个二元素的向量,第一元素为矩阵A的行数,第二元素为矩阵A的列数。在 MATLAB 50中,sie的定义已经扩展到任何多维数组,它的返回值是一个维数向量。如果已经知道 是一个向量,那么 length(v)的返回值是该向量的长度,或max(sie(v))。 3面向矩阵列的运算 为了方便数据分析, MATLAB提供了一部分面向矩阵的列运算的数据分析函数,这些 数主要包括有: 矩阵各列的最大值向量 n 矩阵各列的最小值向量 nean 矩阵各列的平均值向量 median矩阵各列的中值向量 std 矩阵各列的标准偏差向量 短阵各列的元素之和向量 矩阵各列的元素之积向量 cumsum矩阵各列的累加和向量 prod矩阵各列的累积向量 矩阵各列的差分向量 矩阵各列的直方图向量 列向量卷积 排序
第…章 MATLAB系统与语言简介 corrcoef矩阵相关系数 对于向量变量这些函数会把行向量和列向量都作为数组来处理。而对于矩阵变量这 些函数则面向矩阵的列进行运算其结果是行向量。例如,函数max应用于矩阵变量时,返 回的行向量的各元素的值恰为矩阵各列的最大值。用户可以自己编写面向列运算的函数M 文件,只需加入一些辅助的条件语句判别出输入变量是向量还是矩阵。可以参考 MATLAB 的M文件mean.m和dif.m。 在 MATLAB50版中,以上这些函数(除最后一个函数外)都可以应用于多维数组。例 如,函数sum的一般调用命令为 sum(m, d) 其中,M是一个n维数组,d可以是任何表达式,其值介于1与n之间。它的作用是在n维数 组M的第d维方向计算M的元素之和其结果应该是一个a-1维数组。例如: >M= zeros(3,3,4) M(:,:,k)= k * ones(3,3) > sum(m, 1 36 999 222 sum(m, 2) ans 369 369 121212 > sun(M, 3) ans 101010 101010 101010 1.4.4线性代数与稀疏矩阵 MATLAB通过其矩阵运算提供了强有力的数学运算功能。有些常用的算法被设计成 MATLAB的核心程序,运算速度很快。另外一些功能由 MATLAB提供的外部M文件库来 实现。本节主要介绍 MATLAB提供的线性代数功能。 L.矩阵分解与线性方程求解