本节书摘来自异步社区出版社《MATLAB智能算法超级学习手册》一书中的第1章,第1.2节,作者:MATLAB技术联盟 , 高飞 , 许玢更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 矩阵的表示
MATLAB智能算法超级学习手册
矩阵和向量是一样的,用来描述某一个问题的方程组的系数、由方程组的系数和常数构成的方阵。矩阵包括数值矩阵、符号矩阵、特殊矩阵等3种基本样式。
1.2.1 数值矩阵的生成
1.实数矩阵的输入
MATLAB的强大功能之一体现在能直接处理向量或矩阵。前提是用户根据具体的问题输入待处理的向量或矩阵。
一般简单的定义矩阵,可以直接按行方式输入每个元素:同一行中的元素用逗号(,)或者用空格符来分隔,且空格个数不限;不同的行用分号(;)分隔。
所有元素处于一个方括号([ ])内。当矩阵是多维(三维以上)的,且方括号内的元素是维数较低的矩阵时,会有多重方括号。
【例1-1】实数矩阵输入实例。
>> T = [11 12 1 2 3 4 5 6 7 8 9 10]
T =
Columns 1 through 11
11 12 1 2 3 4 5 6 7 8 9
Column 12
10
>> X = [2.32 3.43;4.37 5.98]
X =
2.3200 3.4300
4.3700 5.9800
>> va = [1 2 3 4 5]
va =
1 2 3 4 5
>> MB = [1 2 4;2 3 3;5 4 5]
MB =
1 2 4
2 3 3
5 4 5
>> Null = [ ] %生成一个空矩阵
Null =
[]
2.复数矩阵的输入
复数在现行的控制工程以及复平面计算中应用较多。复数矩阵是指带有虚数的数值矩阵。复数矩阵的生成方式如例1-2和例1-3所示。
【例1-2】复数矩阵输入方式一实例。
>> a=1.7;b=3/25;
C=[1,3*a+i*b,b*sqrt(a); sin(pi/5),a+7*b,3.9+1]
C =
1.0000 5.1000 + 0.1200i 0.1565
0.5878 2.5400 4.9000
【例1-3】复数矩阵输入方式二实例。
>> R=[1 2 3;4 5 6], M=[11 12 13;14 15 16]
R =
1 2 3
4 5 6
M =
11 12 13
14 15 16
>> RM=R+i*M
RM =
1.0000 +11.0000i 2.0000 +12.0000i 3.0000 +13.0000i
4.0000 +14.0000i 5.0000 +15.0000i 6.0000 +16.0000i
1.2.2 符号矩阵的生成
在MATLAB中输入符号向量或者矩阵的方法和输入数值向量或者矩阵在形式上很相似,只不过要用到符号矩阵定义函数sym,或者是用到符号定义函数syms。先定义一些必要的符号变量,再像定义普通矩阵一样输入符号矩阵。
1.用命令sym定义矩阵
这时的函数sym实际上在定义一个符号表达式,符号矩阵中的元素可以是任何符号或者表达式,而且长度没有限制,只是将方括号置于用于创建符号表达式的单引号中。
【例1-4】用命令sym定义矩阵实例。
>> sym_m = sym('[a b c;Jack,Help Me!,NO WAY!]')
sym_m =
[ a, b, c, 0, 0]
[ Jack, Help, factorial(Me), NO, factorial(WAY)]
>> sym_d = sym('[1 2 3;a b c;sin(x) cos(y) tan(z)]')
sym_d =
[ 1, 2, 3]
[ a, b, c]
[ sin(x), cos(y), tan(z)]
2.用命令syms定义矩阵
先定义矩阵中的每一个元素为一个符号变量,然后如数值矩阵操作那样输入符号矩阵。
【例1-5】用命令syms定义矩阵实例。
>> syms a b c
>> M1 = sym('Classical');
>> M2 = sym('Claysw');
>> M3 = sym('yellow');
>> yswM123=[a,b,c;M1,M2,M3;2,3,5;5,4,6]
yswM123 =
[ a, b, c]
[ Classical, Claysw, yellow]
[ 2, 3, 5]
[ 5, 4, 6]
3.把数值矩阵转化成相应的符号矩阵
数值型和符号型在MATLAB中是不相同的,它们之间不能直接进行转化。MATLAB提供了一个将数值型转化成符号型的命令,即sym。
【例1-6】数值型转化成符号型实例。
>> Digit_Ma = [1/3 sqrt(3) 3.1;exp(0.3) log(10) 23^.5]
Syms_Ma = sym(Digit_Ma)
Digit_Ma =
0.3333 1.7321 3.1000
1.3499 2.3026 4.7958
Syms_Ma =
[ 1/3, 3^(1/2), 31/10]
[ 3039611811401035/2251799813685248, 2592480341699211/1125899906842624, 23^(1/2)]
注意:
思考矩阵是用分数形式还是浮点形式表示的。一般情况下,矩阵是以浮点型变量保存的。针对本例,矩阵转化成符号矩阵后以最接近原值的有理数形式或者函数形式表示。
1.2.3 特殊矩阵的生成
(1)全零阵
函数 zeros
格式 B = zeros(n) %生成n×n全零阵
B = zeros(m,n) %生成m×n全零阵
B = zeros([m n]) %生成m×n全零阵
B = zeros(d1,d2,d3…) %生成d1×d2×d3×…全零阵或数组
B = zeros([d1 d2 d3…]) %生成d1×d2×d3…全零阵或数组
B = zeros(size(A)) %生成与矩阵_A_大小相同的全零阵
(2)单位阵
函数 eye
格式 Y = eye(n) %生成n×n单位阵
Y = eye(m,n) %生成m×n单位阵
Y = eye(size(A)) %生成与矩阵A大小相同的单位阵
(3)全1阵
函数 ones
格式 Y = ones(n) %生成n×n全1阵
Y = ones(m,n) %生成m×n全1阵
Y = ones([m n]) %生成m×n全1阵
Y = ones(d1,d2,d3…) %生成d1×d2×d3…全1阵或数组
Y = ones([d1 d2 d3…]) %生成d1×d2×d3…全1阵或数组
Y = ones(size(A)) %生成与矩阵_A_大小相同的全1阵
(4)均匀分布随机矩阵
函数 rand
格式 Y = rand(n) %生成n×n随机矩阵,其元素在(0,1)内
Y = rand(m,n) %生成m×n随机矩阵
Y = rand([m n]) %生成m×n随机矩阵
Y = rand(m,n,p,…) %生成m×n×p×…随机矩阵或数组
Y = rand([m n p…]) %生成m×n×p×…随机矩阵或数组
Y = rand(size(A)) %生成与矩阵A大小相同的随机矩阵
rand %无变量输入时只产生一个随机数
s = rand('state') %产生包括均匀发生器当前状态的35个元素的向量
rand('state', s) %使状态重置为s
rand('state', 0) %重置发生器到初始状态
rand('state', j) %对整数j重置发生器到第j个状态
rand('state', sum (100*clock)) %每次重置到不同状态
(5)正态分布随机矩阵
函数 randn
格式 Y = randn(n) %生成n×n正态分布随机矩阵
Y = randn(m,n) %生成_m×n正态分布随机矩阵
Y = randn([m n]) %生成m×n正态分布随机矩阵
Y = randn(m,n,p,…) %生成m×n×p×…正态分布随机矩阵或数组
Y = randn([m n p…]) %生成m×n×p×…正态分布随机矩阵或数组
Y = randn(size(A)) %生成与矩阵A大小相同的正态分布随机矩阵
randn %无变量输入时只产生一个正态分布随机数
s = randn('state') %产生包括正态发生器当前状态的2个元素的向量
s = randn('state', s) %重置状态为s
s = randn('state', 0) %重置发生器为初始状态
s = randn('state', j) %对于整数j重置状态到第j个状态
s = randn('state', sum(100*clock)) %每次重置到不同状态
(6)产生随机排列
函数 randperm
格式 p = randperm(n) %产生1~n之间整数的随机排列
(7)产生线性等分向量函数linspace
格式 y = linspace(a,b) %在(a,b)上产生100个线性等分点
y = linspace(a,b,n) %在(a,b)上产生n个线性等分点
(8)产生对数等分向量
函数 logspace
格式 y = logspace(a,b) %在(10a,10b)之间产生50个对数等分向量
y = logspace(a,b,n) %在(10a,10b)上产生_n_个对数等分向量
y = logspace(a,pi) %在(10a,π)上产生50个对数等分向量
(9)计算矩阵中元素个数
函数 numel
格式 n = numel(a) %返回矩阵A中元素的个数
(10)产生以输入元素为对角线元素的矩阵
函数 blkdiag
格式 out = blkdiag(a,b,c,d,…) %产生以a,b,c,d,…为对角线元素的矩阵
(11)友矩阵
函数 compan
格式 A = compan(u) %u为多项式系统向量,A为友矩阵,A的第1行元素为-u(2:n)/u(1),其中u(2:n)为u的第2到n个元素,A的特征值就是多项式的特征根
(12)Hadamard矩阵
函数 hadamard
格式 H = hadamard(n) %返回n阶Hadamard矩阵
(13)hankel方阵
函数 hankel
格式 H = hankel(c) %第1列元素为c,反三角以下元素为0
H = hankel(c,r) %第1列元素为c,最后一行元素为r。如果c的最后一个元素与r的第一个元素不同,交叉位置的元素取为c的最后一个元素
(14)Hilbert矩阵
函数 hilb
格式 H = hilb(n) %返回n阶Hilbert矩阵,其元素为H(i,j)=1/(i+j-1)。
(15)逆Hilbert矩阵
函数 invhilb
格式 H = invhilb(n) %产生n阶逆Hilbert矩阵
(16)Magic(魔方)矩阵
函数 magic
格式 M = magic(n) %产生n阶魔方矩阵
(17)Pascal矩阵
函数 pascal
格式 A = pascal(n) %产生n阶Pascal矩阵。它是对称正定矩阵,元素由Pascal三角组成。它的逆矩阵的所有元素都是整数
A = pascal(n,1) %返回由下三角的Cholesky系数组成的Pascal矩阵
A = pascal(n,2) %返回pascal(n,1)的转置和交换的形式
(18)托普利兹矩阵
函数 toeplitz
格式 T = toeplitz(c,r) %生成一个非对称的托普利兹矩阵,将c作为第1列,将r作为第1 行,其余元素与左上角相邻元素相等
T = toeplitz(r) %用向量r生成一个对称的托普利兹矩阵
(19)Wilkinson特征值测试阵
函数 wilkinson
格式 W = wilkinson(n) %返回n阶Wilkinson特征值测试阵