二、MATLAB 矩阵运算基础
1.矩阵的加减运算
如果矩阵的行数=列数,那么矩阵是一个方阵,方阵有很多独特的性质。
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
n
1
a
n
2
⋯
a
n
n
]
A=\left[ \begin{matrix} a_{11} & a_{12}&\cdots&a_{1n}\\ a_{21} & a_{22}&\cdots&a_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} &\cdots &a_{nn}\\ \end{matrix} \right]
A=⎣⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1na2n⋮ann⎦⎥⎥⎥⎤
下面讲一下矩阵加减法,首先必须是两个同型矩阵才能进行加减运算。这里我们假设A、B矩阵都是m*n(m行,n列)的矩阵。
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
]
B
=
[
b
11
b
12
⋯
b
1
n
b
21
b
22
⋯
b
2
n
⋮
⋮
⋱
⋮
b
m
1
b
m
2
⋯
b
m
n
]
A=\left[ \begin{matrix} a_{11} & a_{12}&\cdots&a_{1n}\\ a_{21} & a_{22}&\cdots&a_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} &\cdots &a_{mn}\\ \end{matrix} \right] B=\left[ \begin{matrix} b_{11} & b_{12}&\cdots&b_{1n}\\ b_{21} & b_{22}&\cdots&b_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ b_{m1} & b_{m2} &\cdots &b_{mn}\\ \end{matrix} \right]
A=⎣⎢⎢⎢⎡a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎦⎥⎥⎥⎤B=⎣⎢⎢⎢⎡b11b21⋮bm1b12b22⋮bm2⋯⋯⋱⋯b1nb2n⋮bmn⎦⎥⎥⎥⎤
那么A±B的结果为
A
±
B
=
[
a
11
±
b
11
a
12
±
b
12
⋯
a
1
n
±
b
1
n
a
21
±
b
21
a
22
±
b
22
⋯
a
2
n
±
b
2
n
⋮
⋮
⋱
⋮
a
m
1
±
b
m
1
a
m
2
±
b
m
2
⋯
a
m
n
±
b
m
n
]
A\pm B=\left[ \begin{matrix} a_{11} \pm b_{11} & a_{12} \pm b_{12} &\cdots&a_{1n} \pm b_{1n}\\ a_{21} \pm b_{21} & a_{22} \pm b_{22} &\cdots&a_{2n} \pm b_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} \pm b_{m1} & a_{m2} \pm b_{m2} & \cdots & a_{mn} \pm b_{mn}\\ \end{matrix} \right]
A±B=⎣⎢⎢⎢⎡a11±b11a21±b21⋮am1±bm1a12±b12a22±b22⋮am2±bm2⋯⋯⋱⋯a1n±b1na2n±b2n⋮amn±bmn⎦⎥⎥⎥⎤
在matlab中可以举例进行运算
2.矩阵的乘除运算和转置
⚪矩阵点乘
矩阵的点乘规则,首先依然要求A、B是两个同型的矩阵,这里我们还是设矩阵维度m*n。当然了相应的除法也是同样的道理。
A
⋅
B
=
[
a
11
b
11
a
12
b
12
⋯
a
1
n
b
1
n
a
21
b
21
a
22
b
22
⋯
a
2
n
b
2
n
⋮
⋮
⋱
⋮
a
m
1
b
m
1
a
m
2
b
m
2
⋯
a
m
n
b
m
n
]
A\cdot B=\left[ \begin{matrix} a_{11}b_{11} & a_{12} b_{12} & \cdots & a_{1n}b_{1n}\\ a_{21}b_{21} & a_{22} b_{22} & \cdots & a_{2n}b_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{m1}b_{m1} & a_{m2} b_{m2} & \cdots & a_{mn}b_{mn}\\ \end{matrix} \right]
A⋅B=⎣⎢⎢⎢⎡a11b11a21b21⋮am1bm1a12b12a22b22⋮am2bm2⋯⋯⋱⋯a1nb1na2nb2n⋮amnbmn⎦⎥⎥⎥⎤
matlab执行点乘运算代码如下(以及除法)
⚪矩阵乘法规则
我们首先仍然对矩阵A、B有要求,要求左侧矩阵的列数等于右侧矩阵的行数。即矩阵A为xn,矩阵B为ny。
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
x
1
a
x
2
⋯
a
x
n
]
B
=
[
b
11
b
12
⋯
b
1
y
b
21
b
22
⋯
b
2
y
⋮
⋮
⋱
⋮
b
n
1
b
n
2
⋯
b
n
y
]
A=\left[ \begin{matrix} a_{11} & a_{12}&\cdots&a_{1n}\\ a_{21} & a_{22}&\cdots&a_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{x1} & a_{x2} &\cdots &a_{xn}\\ \end{matrix} \right] B=\left[ \begin{matrix} b_{11} & b_{12}&\cdots&b_{1y}\\ b_{21} & b_{22}&\cdots&b_{2y}\\ \vdots & \vdots & \ddots & \vdots \\ b_{n1} & b_{n2} &\cdots &b_{ny}\\ \end{matrix} \right]
A=⎣⎢⎢⎢⎡a11a21⋮ax1a12a22⋮ax2⋯⋯⋱⋯a1na2n⋮axn⎦⎥⎥⎥⎤B=⎣⎢⎢⎢⎡b11b21⋮bn1b12b22⋮bn2⋯⋯⋱⋯b1yb2y⋮bny⎦⎥⎥⎥⎤
我们假设A×B=C,那么矩阵C的第i行,第j列的值为
C
i
j
=
∑
k
=
1
n
a
i
k
b
k
j
C_{ij}=\sum_{k=1}^n {a_{ik}b_{kj}}
Cij=k=1∑naikbkj
我们举个简单的例子来看了解一下,同时我们也从这个例子中明白AB和BA结果是不同的
⚪矩阵的逆&单位矩阵
我们已经知道了矩阵乘法(叉乘),我们现在来定义一下矩阵的除法。
首先我们要先了解一下单位矩阵,很容易理解只有对角线上的值为1,其余值为0。
I
=
[
1
0
⋯
0
0
1
⋯
0
⋮
⋮
⋱
⋮
0
0
⋯
1
]
I=\left[ \begin{matrix} 1 & 0 &\cdots & 0\\ 0 & 1 &\cdots & 0\\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 &\cdots & 1\\ \end{matrix} \right]
I=⎣⎢⎢⎢⎡10⋮001⋮0⋯⋯⋱⋯00⋮1⎦⎥⎥⎥⎤
我们可以看一下单位矩阵的性质(I是nn的单位矩阵,A是nn的任意方阵)
A
×
I
=
A
;
I
×
A
=
A
A\times I =A; I\times A=A
A×I=A;I×A=A
所以我们可以定义一下矩阵的逆
A
−
1
A^{-1}
A−1
A
×
A
−
1
=
I
A\times A^{-1}= I
A×A−1=I
所以我们定义矩阵A除矩阵B为
A
×
B
−
1
A\times B^{-1}
A×B−1
这里我们还要注意一个问题,如前述有
A
×
B
=
C
A\times B =C
A×B=C,所以
A
=
C
×
B
−
1
A=C\times B^{-1}
A=C×B−1
但是
B
=
C
×
A
−
1
B=C\times A^{-1}
B=C×A−1是错误的
下面我们解释一下原因
我们可以这样理解除法
A
×
B
=
C
A\times B =C
A×B=C两侧同乘
B
−
1
B^{-1}
B−1
A
×
B
×
B
−
1
=
C
×
B
−
1
A\times B\times B^{-1}=C\times B^{-1}
A×B×B−1=C×B−1
我们知道
B
×
B
−
1
=
I
B\times B^{-1}=I
B×B−1=I,所以
A
×
I
=
C
×
B
−
1
→
A
=
C
×
B
−
1
A\times I=C\times B^{-1}\rightarrow A=C\times B^{-1}
A×I=C×B−1→A=C×B−1
但是,
A
×
B
×
A
−
1
=
C
×
A
−
1
A\times B \times A^{-1}=C\times A^{-1}
A×B×A−1=C×A−1之中,由于矩阵相乘的顺序问题,所以左侧不能化简为
B
B
B
所以正确的式子应该是
A
−
1
×
A
×
B
=
A
−
1
×
C
→
B
=
A
−
1
×
C
A^{-1}\times A\times B=A^{-1}\times C \rightarrow B=A^{-1}\times C
A−1×A×B=A−1×C→B=A−1×C
以上讨论基于A和B都是可逆矩阵
下面看一下matlab中如何初始化单位矩阵,如何求逆。
⚪矩阵的转置
转置矩阵表示为
A
T
A^T
AT,规则为
A
i
j
替
换
为
A
j
i
A_{ij}替换为A_{ji}
Aij替换为Aji
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
]
A
T
=
[
a
11
a
21
⋯
a
m
1
a
12
a
22
⋯
a
m
2
⋮
⋮
⋱
⋮
a
1
n
a
2
n
⋯
a
m
n
]
A=\left[ \begin{matrix} a_{11} & a_{12}&\cdots&a_{1n}\\ a_{21} & a_{22}&\cdots&a_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} &\cdots &a_{mn}\\ \end{matrix} \right] A^T=\left[ \begin{matrix} a_{11} & a_{21}&\cdots&a_{m1}\\ a_{12} & a_{22}&\cdots&a_{m2}\\ \vdots & \vdots & \ddots & \vdots \\ a_{1n} & a_{2n} &\cdots &a_{mn}\\ \end{matrix} \right]
A=⎣⎢⎢⎢⎡a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎦⎥⎥⎥⎤AT=⎣⎢⎢⎢⎡a11a12⋮a1na21a22⋮a2n⋯⋯⋱⋯am1am2⋮amn⎦⎥⎥⎥⎤
matlab的代码如下
这里介绍一个小小转置的性质
A
×
A
T
A\times A^T
A×AT
A
×
A
T
=
[
a
11
2
a
21
2
⋯
a
m
1
2
a
12
2
a
22
2
⋯
a
m
2
2
⋮
⋮
⋱
⋮
a
1
n
2
a
2
n
2
⋯
a
m
n
2
]
A\times A^T=\left[ \begin{matrix} a_{11}^2 & a_{21}^2 & \cdots & a_{m1}^2\\ a_{12}^2 & a_{22}^2 & \cdots & a_{m2}^2\\ \vdots & \vdots & \ddots & \vdots \\ a_{1n}^2 & a_{2n}^2 &\cdots &a_{mn}^2\\ \end{matrix} \right]
A×AT=⎣⎢⎢⎢⎡a112a122⋮a1n2a212a222⋮a2n2⋯⋯⋱⋯am12am22⋮amn2⎦⎥⎥⎥⎤
因为matlab对矩阵运算有优化,所以其矩阵运算的速度非常快,所以我们算一批数据的平方,可以用此法计算,是一种优化。这里面也需要注意,在matlab中能矩阵运算的最好避免if或者for的迭代计算。
3.MATALB矩阵的操作
⚪初始化矩阵
为了方便复制代码,下面使用代码片来展示
A=[1,2,3;3,4,5];%其中分号表示行之间的分割
B=zeros(3,4);%表示一个3*4的0矩阵
C=ones(3,4);%表示一个3*4的1矩阵
⚪矩阵元素的表示&行列的表示&更改
详见代码的备注(嘻嘻 )
A=[1,2,3;3,4,5];
B=zeros(3,4);
C=ones(3,4);
A(1,2)=100;%A(1,2)表示A矩阵的第一行第二列,然后更改其值为100
disp(A);
B(1,:)=ones(1,4);%B(1,:)表示B的第一行,然后我们将第一行全部赋1
disp(B);
C(:,2)=zeros(3,1);%C(:,2)表示C的第二列,然后我们将第二列全部赋0
disp(C);
我们看一下输出结果
⚪矩阵区块的赋值
我们还可以在一个大矩阵的某个区域赋值
A=ones(5,5);%初始化一个5*5的1矩阵
disp(A);%打印初始的矩阵
A(2:4,3:4)=zeros(3,2);%将A矩阵2到4行的3到4列都赋值为0
disp(A);%展示第一次更改后的矩阵
C=[2,4;5,6;7,8];
A(2:4,3:4)=C;%给A矩阵再次赋值,将C矩阵赋值在A矩阵2到4行的3到4列的位置
disp(A);
看一下输出的结果