2.3.3 矩阵的创建
在MATLAB中建立矩阵的方法很多,本节将介绍7种,它们分别是:直接输入法、抽取法、拼接法、函数法、拼接函数和变形函数法、加载法和M文件法。不同的方法往往适用于不同的场合和需要。
因为矩阵是MATLAB特别引入的量,所以在表达时,必须给出一些相关的约定与其他量区别,这些约定是:
(1)矩阵的所有元素必须放在方括号([])内;
(2)每行的元素之间需用逗号或空格隔开;
(3)矩阵的行与行之间用分号或回车符分隔;
(4)元素可以是数值或表达式。
这些约定同样适用于2.4节将要讨论的数组。
1.直接输入法
在命令行提示符“>>”后,直接输入一矩阵的方法即是直接输入法。直接输入法对建立规模较小的矩阵是相当方便的,特别适用于在命令窗口讨论问题的场合,也适用于在程序中给矩阵变量赋初值。
【例2.15】 用直接输入法建立矩阵。
>>x=27; y=3; >>A=[1 2 3;4 5 6]; B=[2,3,4;7,8,9;12,2*6+1,14]; >>C=[3 4 5 7 8 x/y 10 11 12]; %用回车符而非分号分隔矩阵各行 >>A, B, C 其运算结果为 A = 1 2 3 4 5 6 B = 2 3 4 7 8 9 12 13 14 C = 3 4 5 7 8 9 10 11 12
2.抽取法
抽取法是从大矩阵中抽取出需要的小矩阵(或子矩阵)。线性代数中分块矩阵就是一个典型的从大矩阵中取出子矩阵块的实例。
矩阵的抽取实质是元素的抽取,依据2.3.2节的介绍,用元素下标的向量表示从大矩阵中去提取元素就能完成抽取过程。
1)用全下标方式
【例2.16】 用全下标抽取法建立子矩阵。
>>clear >>A=[1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >>B=A(1:3,2:3) % 取矩阵A行数为1~3,列数为2~3的元素构成子矩阵B B = 2 3 6 7 10 11 >>C=A([1 3], [2 4]) %取矩阵A行数为1、3,列数为2、4的元素构成子矩阵C C = 2 4 10 12 >>D=A(4, :) %取矩阵A第4行,所有列,“:”可表示所有行或列 D = 13 14 15 16 >>E=A([2 4], end) %取1、4行,最后列,用“end”表示某一维数中的最大值 E = 8 16
2)用单下标方式
【例2.17】 用单下标抽取法建立子矩阵。
>>clear >>A=[1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16] A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >>B=A([4:6;3 5 7;12:14]) B = 13 2 6 9 2 10 15 4 8
本例是从矩阵A中取出单下标4~6的元素做第1行,单下标3、5、7这3个元素做第2行,单下标12~14的元素做第3行,生成一3×3阶新矩阵B。若用B=A([4:6; [3 5 7];12:14])的格式去抽取也是正确的,关键在于若要抽取出矩阵,就必须在单下标引用中的最外层加上一对方括号,以满足MATLAB对矩阵的约定。另外,其中的分号也不能少。分号若改写成逗号时,矩阵将变成向量,例如用C=A([4:5,7,10:13])抽取,则结果为C=[13 2 10 7 11 15 4]。
3.拼接法
行数与行数相同的小矩阵可在列方向扩展拼接成更大的矩阵。同理,列数与列数相同的小矩阵可在行方向扩展拼接成更大的矩阵。
【例2.18】 小矩阵拼成大矩阵。
>> A=[1 2 3;4 5 6;7 8 9], B=[9 8;7 6;5 4], C=[4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 B = 9 8 7 6 5 4 C = 4 5 6 7 8 9 >> E=[A B; B A] %行列两个方向同时拼接,请留意行、列数的匹配问题 E = 1 2 3 9 8 4 5 6 7 6 7 8 9 5 4 9 8 1 2 3 7 6 4 5 6 5 4 7 8 9 >> F=[A; C] %A、C列数相同,沿行向扩展拼接 1 2 3 4 5 6 7 8 9 4 5 6 7 8 9
4.函数法
MATLAB有许多函数可以生成矩阵,大致可分为基本函数和特殊函数两类。基本函数主要生成一些常用的工具矩阵,如表2-8所示。特殊函数则生成一些特殊矩阵,如希尔伯特矩阵、魔方矩阵、帕斯卡矩阵、范德蒙矩阵等,这些矩阵如表2-9所示。
表2-8 常用工具矩阵生成函数
表2-9 特殊矩阵生成函数
在表2-8的常用工具矩阵生成函数中,除了eye外,其他函数都能生成三维以上的多维数组(2.4.2节将给出介绍),而eye(m, n)可生成非方阵的单位阵。
【例2.19】 用函数生成矩阵。
>>A=ones(3,4), B=eye(3,4), C=magic(3) A = 1 1 1 1 1 1 1 1 1 1 1 1 B = 1 0 0 0 0 1 0 0 0 0 1 0 C = 8 1 6 3 5 7 4 9 2 >> format rat; D=hilb(3), E=pascal(4) %rat的数值显示格式可将小数用分数表示 D = 1 1/2 1/3 1/2 1/3 1/4 1/3 1/4 1/5 E = 1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20
n阶魔方矩阵的特点是每行、每列和两对角线上的元素之和各等于(n3+n)/2。例如上例中3阶魔方阵每行、每列和两对角线元素和为15。希尔伯特矩阵的元素在行、列方向和对角线上的分布规律是显而易见的,而帕斯卡矩阵在其副对角线及其平行线上的变化规律实际上就是中国人称为杨辉三角而西方人称帕斯卡三角的变化规律。
5.拼接函数和变形函数法
拼接函数法是指用cat和repmat函数将多个或单个小矩阵或沿行、或沿列方向拼接成一个大矩阵。
cat函数的使用格式是:cat(n, A1, A2, A3, …), n=1时,表示沿行方向拼接;n=2,表示沿列方向拼接。n可以是大于2的数字,此时拼接出的是多维数组,2.4.2节将会加以讨论。
repmat函数的使用格式是:repmat(A, m, n…), m和n分别是沿行和列方向重复拼接矩阵A的次数。
【例2.20】 用cat函数实现矩阵A1和A2分别沿行向和沿列向的拼接。
>> A1=[1 2 3;9 8 7;4 5 6], A2=A1.' A1 = 1 2 3 9 8 7 4 5 6 A2 = 1 9 4 2 8 5 3 7 6 >> cat(1, A1, A2, A1) %沿行向拼接 ans = 1 2 3 9 8 7 4 5 6 1 9 4 2 8 5 3 7 6 1 2 3 9 8 7 4 5 6 >> cat(2, A1, A2) %沿列向拼接 ans = 1 2 3 1 9 4 9 8 7 2 8 5 4 5 6 3 7 6
【例2.21】 用repmat函数对矩阵A1实现沿行向和沿列向的拼接(续例2.20)。
>> repmat(A1,2,2) ans = 1 2 3 1 2 3 9 8 7 9 8 7 4 5 6 4 5 6 1 2 3 1 2 3 9 8 7 9 8 7 4 5 6 4 5 6 >> repmat(A1,2,1) ans = 1 2 3 9 8 7 4 5 6 1 2 3 9 8 7 4 5 6 >> repmat(A1,1,3) ans = 1 2 3 1 2 3 1 2 3 9 8 7 9 8 7 9 8 7 4 5 6 4 5 6 4 5 6
变形函数法主要是把一向量通过变形函数reshape变换成矩阵,当然也可将一个矩阵变换成一个新的、与之阶数不同的矩阵。reshape函数的使用格式是:reshape(A, m, n…), m和n分别是变形后新矩阵的行列数。
【例2.22】 用变型函数生成矩阵。
>>A=linspace(2,18,9) A = 2 4 6 8 10 12 14 16 18 >>B=reshape(A,3,3) %注意新矩阵的排列方式,从中体会矩阵元素的存储次序 B = 2 8 14 4 10 16 6 12 18 >>a=20:2:24; b=a.'; %生成3个元素的列向b,便于将矩阵B扩展成3×4阶的矩阵C >>C=[B b], D=reshape(C,4,3)%将3×4阶的矩阵C变形成4×3阶的矩阵D C = 2 8 14 20 4 10 16 22 6 12 18 24 D = 2 10 18 4 12 20 6 14 22 8 16 24
6.加载法
所谓加载法是指将已经存放在外存中的.mat文件读入MATLAB工作空间中。这一方法的前提是:必须在外存中事先已保存了该.mat文件且数据文件中的内容是所需的矩阵。
在用MATLAB编程解决实际问题时,可能需要将程序运行的中间结果用.mat保存在外存中以备后面的程序调用。这一调用过程实质就是将外存中的数据(包括矩阵)加载到MATLAB内存工作空间以备当前程序使用。
加载的方法具体有菜单法和命令法,在命令窗口中交互讨论问题时,用菜单和用命令都可用来加载数据,但在程序设计时就只能用命令去书写程序了。具体来说,加载用的菜单是命令窗口中的File|Import Data,而命令则是load。
【例2.23】 利用外存数据文件加载矩阵。
>> clear >> load sl2_19 %从外存中加载事先保存在可搜索路径中的数据文件sl2_19.mat >> who %询问加载的矩阵名称,参见1.8节表1.8的命令 Your variables are: A >> A %显示加载的矩阵内容 A = 4 5 6 7 1 2 3 4 9 8 7 6
7.M文件法
M文件法和加载法其实十分相似,都是将事先保存在外存中的矩阵读入内存工作空间中,不同点在于加载法读入的是数据文件(.mat),而M文件法读入的是内容仅为矩阵的.m文件。
M文件一般是程序文件,其内容通常为命令或程序设计语句,但也可存放矩阵,因为给一个矩阵赋值本身就是一条语句。在程序设计中,当矩阵的规模较大,而这些矩阵又要经常被引用时,若每次引用都采用直接输入法,这样既容易出错又很笨拙。一个省时、省力而又保险的方法就是:先用直接输入法将某个矩阵准确无误地赋值给一个程序中会被反复引用的矩阵,且用M文件将其保存。每当用到该矩阵时,就只需在程序中引用该M文件即可。