Version:1.0StartHTML:000000542EndHTML:000541203StartFragment:000421344EndFragment:000541135StartSelection:000421344EndSelection:000541135SourceURL:https://mp.weixin.qq.com/s?__biz=MzUyODE4MTAwNw==&tempkey=OTg5XzlnV2dyUE1xa3JCZnkxaXNrcDZtN3dPNDU2ME1tR01KenR0WWpiV0dPNUVtN2FaWVRfbk4yNDNJVFlDV0RoblIxcEJDQm1TOE9TNDViOERqQkRmZjByQll2aTU1WXlOek1XV3JlMzRlRDNOdXVicS1tZVZtXzNUc1ZyQ3EtUE5tUFdjSUQ2Zng4cmo5TmJ5WmNQRzQ1bjRlWDhIbjFTa3Zwd1JiQWd%2Bfg%3D%3D&chksm=7a7573c54d02fad3ca055c095d23414d7ab233491fb4bcb58d71201da6ba60775a3ef79cfc19
MATLAB既然以矩阵实验室命名,就说明该软件在矩阵计算方面具有非常优异的表现。在MATLAB中,一般情况下一个矩阵就是指一个长方形的数组。特殊情况有两个,一是单一元素的标量,二是只有一行或者一列的矩阵,也就是向量。MATLAB也有其他储存数值和非数值数据的方式,但是对于初学者来说,最好是将所有的情况都考虑为矩阵,这样更容易使用。MATLAB的设计理念是所有的操作尽可能的自然。其他编程语言在处理数据的过程中,每次只能处理一个数值,而MATLAB则允许用户快速方便地采用矩阵来操作。
1.矩阵的创建与组合
MATLAB最基本的数据结构就是矩阵,一个二维的、长方形形状的数据,可以用易于使用的矩阵形式来储存,这些数据可以是数字、字符、逻辑状态(true或者false),甚至是MATLAB的结构数组类型。MATLAB使用二维的矩阵来储存单个数值或者线性数列。MATLAB同时支持多于二维的数据结构。
1.1创建简单矩阵
MATLAB是基于矩阵的计算环境。所有用户输入的数据都将会以矩阵的形式或者多维数组来储存。即使是一个数值型的标量,比如说100,都会以矩阵的形式来储存。
【例2-1】 单个标量的输入示例。
>> A = 100; % 输入数值A
>> whos % whos命令可以用来查看Workspace中所存储的变量信息
Name Size Bytes Class Attributes
A 1x1 8 double
从本例可以看出,标量A的存储格式为1×1的矩阵,它占用了8个字节的内存空间,数据的类型是双精度浮点数。
创建MATLAB矩阵最简单的方式是使用MATLAB的矩阵构建标识符,即方括号[]。创建一个行向量只需要在中括号里面输入相应的元素,并用空格或者逗号作为分隔符分隔相邻的元素即可。
>> row = [E1, E2, ..., En]
>> row = [E1 E2 ... En]
如果要在矩阵中输入下一行,用分号作为行之间的分隔符即可:
>>A = [row1; row2; ...; rown]
例如创建一个包括5个元素的单行矩阵,可以在命令行中输入下面的命令:
>> A = [12 62 93 -8 22];
【例2-2】 创建2~20区间内以2为步长的向量。
在MATLAB中可以通过“初值:步长:终值”的方式创立向量。本例中可以在命令窗口中输入:
>>a=2:2:20
按回车键,在命令窗口显示为:
a =
2 4 6 8 10 12 14 16 18 20
需要指出的是:步长可以为正数、负数或者小数。若用户不指定表达式中的步长一项,MATLAB则默认步长为1。例如:
>> b=1:10
b =
1 2 3 4 5 6 7 8 9 10
另外如果用户指定的区间并不是步长的整数倍,那么将以初值为准,依次加上步长来产生序列,正如下面的c中所示。
>> c=3:5:15
c =
3 8 13
【例2-3】 举例说明如何创建一个3行5列的矩阵。需要指出的是:在矩阵的输入过程中,矩阵的每一行必须有同样多的元素个数。
>> A = [12 62 93 -8 22; 16 2 87 43 91; -4 17-72 95 6]
A =
12 62 93 -8 22
16 2 87 43 91
-4 17 -72 95 6
方括号标识符只能创建二维矩阵,包括0´0、1´1、1´n、m´n等类型。如果要创建多维矩阵,请继续关注公号文章。而如果需要读取和赋值矩阵中的某些元素,也请继续关注。
在将一个带正负号的数值输入矩阵的时候要注意,符号后面要紧接着数值,两者之间不要有空格。通过下面的比较可以看出有哪些不同。
【例2-4】 矩阵中带符号的数值输入示例。
下面两个在运算表达式中的例子说明,符号与数值之间是否有空格并不影响计算的结果。
>> 7 -2 +5
ans =
10
>> 7 - 2 +5
ans =
10
但是下面的两个例子则说明,在矩阵的输入过程中如果符号与数值之间有空格,那么其结果是不同的。读者在这方面一定要注意,以免导致计算结果错误。
>> [7 - 2 + 5]
ans =
10
>> [7 -2 +5]
ans =
7 -2 5
1.2 创建特殊矩阵
MATLAB内嵌有很多函数,可以直接用来创建不同的特殊矩阵。比如创建汉克尔矩阵和范德蒙德矩阵。表2-1中列出了一些常用的特殊矩阵的创建函数。这里需要再次强调一下,函数名称对于大小写是敏感的,在MATLAB中函数名称一般是全部小写的,如果转换了其中一个字母的大小写那么可能调用的就是另一个函数或者会发生调用错误。
表2-1 常用特殊矩阵的创建函数
函数名称函数功能函数名称函数功能
zeros产生一个所有元素为零的矩阵pascal生成PASCAL矩阵
diag产生一个对角矩阵rand随机产生均匀分布的矩阵
ones生成所有元素全为1的矩阵randn随机产生正态分布的矩阵
eye生成单位矩阵randperm产生一个由指定整数元素随机分布构成的矩阵
magic生成魔方矩阵
【例2-5】 特殊矩阵创建函数示例。
>> ones(4) %创建所有元素为1的矩阵
ans =
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
>> eye(5) %创建单位矩阵
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
>> rand(2,3) %创建2´3的均匀分布随机数矩阵
ans =
0.8147 0.1270 0.6324
0.9058 0.9134 0.0975
>> randperm(7) % 创建由1∶7构成的随机数列
ans =
5 1 2 7 3 4 6
需要指出的是:每次运行随机函数都会得到不同的结果,这是因为默认状态下随机数的种子都不同。这也是随机数的意义所在。若要用函数产生相同的矩阵以验证操作的结果,可以按如下方法设置随机种子状态:
>>rand('state', 0);
>> randperm(7)
ans =
2 7 4 3 6 5 1
通过如此设置,读者就可以得到和本书中相同的结果。
1.3 矩阵的合并
矩阵的合并是指将两个或者多个矩阵合并到一起构成一个新的矩阵。前面提到的矩阵标识符方括号[],不仅可以用来创建新的矩阵,还可以用来将若干个矩阵合并到一起。
表达式C = [A B]将矩阵A和B在水平方向上合并到一起,而表达式C = [A; B]则将矩阵A和B在竖直方向上合并到一起。
【例2-6】 求矩阵A和B在竖直方向上合并到一起后得到的矩阵C。
>> rand('state', 0); % 设置随机种子,便于读者验证
>> A = ones(2, 5) * 6; % 元素全部为6的2´5矩阵
>> B = rand(3, 5); % 3´5 的随机数矩阵
>> C = [A; B]
C =
6.0000 6.0000 6.0000 6.0000 6.0000
6.0000 6.0000 6.0000 6.0000 6.0000
0.9501 0.4860 0.4565 0.4447 0.9218
0.2311 0.8913 0.0185 0.6154 0.7382
0.6068 0.7621 0.8214 0.7919 0.1763
需要指出的是:在矩阵的合并过程中要保持新生成的矩阵为长方形,否则MATLAB将会报错。也就是说,如果要在水平方向上合并矩阵,那么每个子矩阵的行数必须相同;如果要在竖直方向上合并矩阵,那么每个子矩阵的列数必须相同。
如图2-1所示,图中具有相同行数的矩阵可以水平合并,而行数不同的矩阵是不能水平合并的。