矩阵是MATLAB数据存储的基本单元,而矩阵的运算是MATLAB语言的核心,在MATLAB语言系统中几乎一切运算均是以对矩阵的操作为基础的。下面重点介绍矩阵的生成、矩阵的基本运算和矩阵的数组运算。 5.1 矩阵的生成 若要输入矩阵,则必须在每一列结尾加上分号(;),如下例: A = [1 2 3 4; 5 6 7 8; 9 10 11 12]; A = 1 2 3 4 5 6 7 8 9 10 11 12 1. 直接输入法 从键盘上直接输入矩阵是最方便、最常用的创建数值矩阵的方法,尤其适合较小的简单矩阵。在用此方法创建矩阵时,应当注意以下几点: ● 输入矩阵时要以“[ ]”为其标识符号,矩阵的所有元素必须都在括号内。 ● 矩阵同行元素之间由空格或逗号分隔,行与行之间用分号或回车键分隔。 ● 矩阵大小不需要预先定义。 ● 矩阵元素可以是运算表达式。 ● 若“[ ]”中无元素表示空矩阵。 2.利用M文件建立矩阵 对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。利用M文件建立MYMAT矩阵: (1) 启动有关编辑程序或MATLAB文本编辑器,并输入待建矩阵: (2) 把输入的内容以纯文本方式存盘(设文件名为mymatrix.m)。 (3) 在MATLAB命令窗口中输入mymatrix,即运行该M文件,就会自动建立一个名为MYMAT的矩阵,可供以后使用。 外部文件读入法 可以利用任意的文本编辑器编辑所要使用的矩阵,矩阵元素之间以特定分断符分开,并按行列布置。读入矩阵的一种方法可参考数据交换系统。 另外MATLAB语言也允许用户调用在MATLAB环境之外定义的矩阵。可以利用load函数,其调用方法为: Load+文件名[参数] Load函数将会从文件名所指定的文件中读取数据,并将输入的数据赋给以文件名命名的变量,如果不给定文件名,则将自动认为matlab.mat文件为操作对象,如果该文件在MATLAB搜索路径中不存在时,系统将会报错。 例如: 事先在记事本中建立文件: 1 1 1 (并以data1.txt保存) 1 2 3 1 3 6 在MATLAB命令窗口中输入: >> load data1.txt >> data1 data1= 1 1 1 1 2 3 1 3 6 3. 利用冒号表达式建立一个向量 冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3 其中e1为初始值,e2为步长,e3为终止值。 首先,可以用冒号来定义行向量。 例如: >> a=1:0.5:4 a= Columns 1 through 7 1 1.5 2 2.5 3 3.5 4 其次,通过使用冒号,可以截取指定矩阵中的部分。 例如: >> A=[1 2 3;4 5 6;7 8 9]
A= 1 2 3 4 5 6 7 8 9 >> B=A (1:2, : ) B= 1 2 3 4 5 6 通过上例可以看到B是由矩阵A的1到2行和相应的所有列的元素构成的一个新的矩阵。在这里,冒号代替了矩阵A的所有列。 在MATLAB中,还可以用linspace函数产生行向量。 其调用格式为: linspace(a,b,n) 其中a和b是生成向量的第一个和最后一个元素,n是元素总数。 显然,linspace(a,b,n)与a:(b-a)/(n-1):b等价。 4.特殊矩阵的生成 对于一些比较特殊的矩阵(单位阵、矩阵中含1或0较多),由于其具有特殊的结构,MATLAB提供了一些函数用于生成这些矩阵。常用的有下面几个: zeros(m) 生成m阶全0矩阵 eye(m) 生成m阶单位矩阵 ones(m) 生成m阶全1矩阵 rand(m) 生成m阶均匀分布的随机阵 randn(m) 生成m阶正态分布的随机矩阵
我们可以对矩阵进行各种处理: A(2,3) = 5 % 改变位於第二列,第三行的元素值 A = 1 2 3 4 5 6 5 8 9 10 11 12 B = A(2,1:3) % 取出部份矩阵B B = 5 6 5 A = [A B'] % 将B转置後以行向量并入A A = 1 2 3 4 5 5 6 5 8 6 9 10 11 12 5 A(:, 2) = [] % 删除第二行(:代表所有列) A = 1 3 4 5 5 5 8 6 9 11 12 5 A = [A; 4 3 2 1] % 加入第四列 A = 1 3 4 5 5 5 8 6 9 11 12 5 4 3 2 1 A([1 4], :) = [] % 删除第一和第四列(:代表所有行) A = 5 5 8 6 9 11 12 5 这几种矩阵处理的方式可以相互叠代运用,产生各种意想不到的效果。
小提示:在MATLAB的内部资料结构中,每一个矩阵都是一个以行为主(Column-oriented )的阵列(Array)因此对於矩阵元素的存取,我们可用一维或二维的索引(Index)来定址。举例来说,在上述矩阵A中,位於第二列、第三行的元素可写为A(2,3) (二维索引)或A(6)(一维索引,即将所有直行进行堆叠後的第六个元素)。 此外,若要重新安排矩阵的形状,可用reshape命令: B = reshape(A, 4, 2) % 4是新矩阵的列数,2是新矩阵的行数 B = 5 8 9 12 5 6 11 5 小提示: A(:)就是将矩阵A每一列堆叠起来,成为一个行向量,而这也是MATLAB变数的内部储存方式。以前例而言,reshape(A, 8, 1)和A(:)同样都会产生一个8x1的矩阵。 5.2 矩阵的基本数学运算 矩阵的基本数学运算包括矩阵的四则运算、与常数的运算、逆运算、行列式运算、秩运算、特征值运算等基本函数运算,这里进行简单介绍。 1.四则运算 矩阵的加、减、乘运算符分别为“+,—,*” ,用法与数字运算几乎相同,但计算时要满足其数学要求(如:同型矩阵才可以加、减)。 在MATLAB中矩阵的除法有两种形式:左除“\”和右除“/”。在传统的MATLAB算法中,右除是先计算矩阵的逆再相乘,而左除则不需要计算逆矩阵直接进行除运算。通常右除要快一点,但左除可避免被除矩阵的奇异性所带来的麻烦。在MATLAB6中两者的区别不太大。 2.与常数的运算 常数与矩阵的运算即是同该矩阵的每一元素进行运算。但需注意进行数除时,常数通常只能做除数。 3.基本函数运算 矩阵的函数运算是矩阵运算中最实用的部分,常用的主要有以下几个: det(a) 求矩阵a的行列式 eig(a) 求矩阵a的特征值 inv(a)或a ^ (-1) 求矩阵a的逆矩阵 rank(a) 求矩阵a的秩 trace(a) 求矩阵a的迹(对角线元素之和) 例如: >> a=[2 1 –3 –1; 3 1 0 7; -1 2 4 –2; 1 0 –1 5]; >> a1=det(a); >> a2=det(inv(a)); >> a1*a2 ans= 1 注意:命令行后加“;”表示该命令执行但不显示执行结果。 4.2.2 矩阵的数组运算 我们在进行工程计算时常常遇到矩阵对应元素之间的运算。这种运算不同于前面讲的数学运算,为有所区别,我们称之为数组运算。 1.基本数学运算 数组的加、减与矩阵的加、减运算完全相同。而乘除法运算有相当大的区别,数组的乘除法是指两同维数组对应元素之间的乘除法,它们的运算符为“.*”和“./”或“.\”。前面讲过常数与矩阵的除法运算中常数只能做除数。在数组运算中有了“对应关系”的规定,数组与常数之间的除法运算没有任何限制。 另外,矩阵的数组运算中还有幂运算(运算符为 .^ )、指数运算(exp)、对数运算(log)、和开方运算(sqrt)等。有了“对应元素”的规定,数组的运算实质上就是针对数组内部的每个元素进行的。 例如: >> a=[2 1 -3 -1; 3 1 0 7; -1 2 4 -2; 1 0 -1 5]; >> a^3 ans= 32 -28 -101 34 99 -12 -151 239 -1 49 93 8 51 -17 -98 139 >> a .^3 ans= 8 1 -27 -1 27 1 0 343 -1 8 64 -8 1 0 -1 125 由上例可见矩阵的幂运算与数组的幂运算有很大的区别。 2.逻辑关系运算 逻辑运算是MATLAB中数组运算所特有的一种运算形式,也是几乎所有的高级语言普遍适用的一种运算。它们的具体符号、功能及用法见表4-2。 表4-2 符号运算符 功 能 函 数 名 = = 等于 eq ~ = 不等于 ne < 小于 lt > 大于 gt <= 小于等于 le >= 大于等于 ge & 逻辑与 and | 逻辑或 or ~ 逻辑非 not 说明: ● 在关系比较中,若比较的双方为同维数组,则比较的结果也是同维数组。它的元 素值由0和1组成。当比较双方对应位置上的元素值满足比较关系时,它的对 应值为1,否则为0。 ● 当比较的双方中一方为常数,另一方为一数组,则比较的结果与数组同维。 ● 在算术运算、比较运算和逻辑与、或、非运算中,它们的优先级关系先后为: 比较运算、算术运算、逻辑与或非运算。 例如: >>a=[1 2 3; 4 5 6; 7 8 9]; >> x=5; >> y= ones(3)*5; >> xa= x<=a xa= 0 0 0 0 1 1 1 1 1 >> b=[0 1 0; 1 0 1; 0 0 1]; >> ab=a&b ab= 0 1 0 1 0 1 0 0 1 |
|
来自: 陆潇潇 > 《2MATLAB语言的核心—矩阵》