矩阵
定义
在数学中,矩阵(Matrix)是一个按照长方阵列排列的实数或复数集合,最早来自于方程组的系数及常数所构成的方阵。
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题。在物理学中,矩阵在电路学、力学、光学和量子物理中都有应用。在计算机学科中,三维动画制作也需要用到矩阵。 ——G老师的 P o w e r P o i n t Power\ Point Power Point
由 m × n m×n m×n个数 a i j a_{ij} aij排成的 m m m行 n n n列的数表称为 m m m行 n n n列的矩阵,简称 m × n m×n m×n矩阵。记作:
这 m × n m×n m×n个数称为矩阵 A A A的元素,简称元。数 a i j a_{ij} aij位于矩阵 A A A的第 i i i行第j列,称为矩阵 A A A的(i,j)元,以数 a i j a_{ij} aij为 ( i , j ) (i,j) (i,j)元的矩阵可记为 ( a i j ) (a_{ij}) (aij)或 ( a i j ) m × n (a_{ij})_{m×n} (aij)m×n, m × n m×n m×n矩阵 A A A也记作 A m n A_{mn} Amn。
元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于 n n n的矩阵称为 n n n阶矩阵或 n n n阶方阵。 n n n阶方阵中所有 i = j i=j i=j的元素 a i j a_{ij} aij组成的斜线称为(主)对角线,所有 i + j = n + 1 i+j=n+1 i+j=n+1的元素 a i j a_{ij} aij组成的斜线称为辅对角线。 ——G老师的 P o w e r P o i n t Power\ Point Power Point
基本运算
矩阵的基本运算包括加法、减法、数乘(不是乘法)、转置、共轭和共轭转置等。
加法,减法
对于两个同型(行列数一样)矩阵
A
A
A和
B
B
B,加法就是把对应
(
i
,
j
)
(i,j)
(i,j)元做加法运算。
例:
[
1
2
3
−
1
−
2
−
3
]
+
[
3
2
1
−
3
−
2
−
1
]
=
[
4
4
4
−
4
−
4
−
4
]
\begin{bmatrix}1&2&3\\-1&-2&-3\end{bmatrix}+\begin{bmatrix}3&2&1\\-3&-2&-1\end{bmatrix}=\begin{bmatrix}4&4&4\\-4&-4&-4\end{bmatrix}
[1−12−23−3]+[3−32−21−1]=[4−44−44−4]
矩阵的加法运算满足结合律和交换律,即:
A
+
B
=
B
+
A
(
A
+
B
)
+
C
=
A
+
(
B
+
C
)
A+B=B+A\\ (A+B)+C=A+(B+C)
A+B=B+A(A+B)+C=A+(B+C)
同理,减法也是这样的:
[
1
2
3
−
1
−
2
−
3
]
−
[
3
2
1
−
3
−
2
−
1
]
=
[
−
2
0
2
2
0
−
2
]
\begin{bmatrix}1&2&3\\-1&-2&-3\end{bmatrix}-\begin{bmatrix}3&2&1\\-3&-2&-1\end{bmatrix}=\begin{bmatrix}-2&0&2\\2&0&-2\end{bmatrix}
[1−12−23−3]−[3−32−21−1]=[−22002−2]
数乘
矩阵的数乘是指一个数乘以一个矩阵,只要把这个数乘到每一个
(
i
,
j
)
(i,j)
(i,j)元上。
例:
2
∗
[
3
2
1
−
3
−
2
−
1
]
=
[
6
4
2
−
6
−
4
−
2
]
2*\begin{bmatrix}3&2&1\\-3&-2&-1\end{bmatrix}=\begin{bmatrix}6&4&2\\-6&-4&-2\end{bmatrix}
2∗[3−32−21−1]=[6−64−42−2]
矩阵的数乘运算满足结合律和分配率,即:
(
λ
μ
)
A
=
λ
(
μ
A
)
(
λ
+
μ
)
A
=
λ
A
+
μ
A
λ
(
A
+
B
)
=
λ
A
+
λ
B
(\lambda \mu )A=\lambda (\mu A)\\ (\lambda +\mu )A=\lambda A+\mu A\\ \lambda (A+B)=\lambda A+\lambda B
(λμ)A=λ(μA)(λ+μ)A=λA+μAλ(A+B)=λA+λB
矩阵的加法、减法和数乘运算合称为矩阵的“线性”运算
转置
把矩阵 A A A的行换成同序数的列所得到的新矩阵称为 A A A的转置矩阵,这一过程称为矩阵的转置。
[
1
2
3
−
1
−
2
−
3
]
T
=
[
1
−
1
2
−
2
3
−
3
]
\begin{bmatrix}1&2&3\\-1&-2&-3\end{bmatrix}^T=\begin{bmatrix}1&-1\\2&-2\\3&-3\end{bmatrix}
[1−12−23−3]T=⎣⎡123−1−2−3⎦⎤
显然有
(
A
T
)
T
=
A
(
λ
A
)
T
=
λ
A
T
(
A
B
)
T
=
A
T
B
T
(A^T)^T=A\\(\lambda A)^T=\lambda A^T\\(AB)^T=A^T B^T
(AT)T=A(λA)T=λAT(AB)T=ATBT
共轭,共轭转置
这个不常用就直接发图片了吧(Pia~Pia)
行列式
一个
n
×
n
n×n
n×n的方阵
A
A
A的行列式记为
det
(
A
)
\det(A)
det(A)或者
∣
A
∣
|A|
∣A∣,一个
2
×
2
2×2
2×2矩阵的行列式可表示如下:
d
e
t
[
a
b
c
c
]
=
a
d
−
b
c
det\begin{bmatrix}a&b\\c&c\end{bmatrix}=ad-bc
det[acbc]=ad−bc
把一个
n
n
n阶行列式中的元素
a
i
j
a_{ij}
aij所在的第i行和第j列划去后,留下来的
n
−
1
n-1
n−1阶行列式叫做元素
a
i
j
a_{ij}
aij的余子式,记作
M
i
j
M_{ij}
Mij。记
A
i
j
=
(
−
1
)
i
+
j
M
i
j
A_{ij}=(-1)^{i+j}M_{ij}
Aij=(−1)i+jMij,叫做元素
a
i
j
a_{ij}
aij的代数余子式。例如:
D
=
[
a
11
a
12
a
13
a
14
a
21
a
22
a
23
a
24
a
31
a
32
a
33
a
34
a
41
a
42
a
43
a
44
]
M
23
=
[
a
11
a
12
a
14
a
31
a
32
a
34
a
41
a
42
a
44
]
D=\begin{bmatrix}a_{11}&a_{12}&a_{13}&a_{14}\\a_{21}&a_{22}&a_{23}&a_{24}\\a_{31}&a_{32}&a_{33}&a_{34}\\a_{41}&a_{42}&a_{43}&a_{44}\end{bmatrix}\quad\quad\quad\quad\quad M_{23}=\begin{bmatrix}a_{11}&a_{12}&a_{14}\\a_{31}&a_{32}&a_{34}\\a_{41}&a_{42}&a_{44}\end{bmatrix}
D=⎣⎢⎢⎡a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44⎦⎥⎥⎤M23=⎣⎡a11a31a41a12a32a42a14a34a44⎦⎤
A
23
=
(
−
1
)
2
+
3
M
23
=
−
M
23
A_{23}=(-1)^{2+3}M_{23}=-M_{23}
A23=(−1)2+3M23=−M23
一个
n
×
n
n×n
n×n矩阵的行列式等于其任意行(或列)的元素与对应的代数余子式乘积之和,即:
det
(
A
)
=
∑
j
=
1
n
a
i
j
(
−
1
)
i
+
j
det
(
A
i
j
)
\det(A)=\sum_{j=1}^n a_{ij}(-1)^{i+j}\det(A_{ij})
det(A)=j=1∑naij(−1)i+jdet(Aij)
栗子:已知方阵
A
=
[
1
2
3
4
5
6
7
8
9
]
A=\begin{bmatrix}1&2&3\\4&5&6\\ 7&8&9\end{bmatrix}
A=⎣⎡147258369⎦⎤,求
∣
A
∣
|A|
∣A∣或
det
(
A
)
\det(A)
det(A)
解:
det
(
A
)
=
1
∗
(
−
1
)
2
∗
[
5
6
8
9
]
+
2
∗
(
−
1
)
3
∗
[
4
6
7
9
]
+
3
∗
(
−
1
)
4
∗
[
4
5
7
8
]
=
1
∗
(
−
3
)
+
(
−
2
)
∗
(
−
6
)
+
3
∗
(
−
3
)
=
0
\det(A)=1*(-1)^2 *\begin{bmatrix}5&6\\8&9\end{bmatrix}+ 2*(-1)^3*\begin{bmatrix}4&6\\ 7&9\end{bmatrix}+3*(-1)^4*\begin{bmatrix}4&5\\ 7&8\end{bmatrix}=1*(-3)+(-2)*(-6)+3*(-3)=0
det(A)=1∗(−1)2∗[5869]+2∗(−1)3∗[4769]+3∗(−1)4∗[4758]=1∗(−3)+(−2)∗(−6)+3∗(−3)=0
所以明显可以用递归解决……
矩阵和行列式的区别
- 矩阵是一个表格,行数和列数可以不一样;而行列式是一个数,且行数必须等于列数。只有方阵才可以定义它的行列式,而对于长方阵不能定义它的行列式。
- 两个矩阵相等是指对应元素都相等;两个行列式相等不要求对应元素都相等,甚至阶数也可以不一样,只要运算代数和的结果一样就行了。
- 两矩阵相加是将各对应元素相加;两行列式相加,是将运算结果相加,在特殊情况下(比如有行或列相同),只能将一行(或列)的元素相加,其余元素照写。
- 数乘矩阵是指该数乘以矩阵的每一个元素;而数乘行列式,只能用此数乘行列式的某一行或列,提公因数也如此。
- 矩阵经初等变换,其秩不变;行列式经初等变换,其值可能改变:换法变换要变号,倍法变换差倍数;消法变换不改变。
矩阵乘法
对于两个矩阵:
n
n
n行
m
m
m列的
A
A
A,
m
m
m行
p
p
p列的
B
B
B,可以定义
C
=
A
×
B
C=A\times B
C=A×B。
C
C
C是一个
n
n
n行
p
p
p列的矩阵,且
C
i
,
j
=
∑
k
=
1
m
A
i
,
k
×
B
k
,
j
C_{i,j}=\sum_{k=1}^mA_{i,k}\times B_{k,j}
Ci,j=k=1∑mAi,k×Bk,j
栗子:下面两个矩阵的乘积
[
1
2
3
3
4
5
]
[
1
2
3
4
3
4
5
6
5
6
7
8
]
\begin{bmatrix}1&2&3\\3&4&5\end{bmatrix}\quad\quad\quad\begin{bmatrix}1&2&3&4\\3&4&5&6\\5&6&7&8\end{bmatrix}
[132435]⎣⎡135246357468⎦⎤为
[
1
∗
1
+
2
∗
3
+
3
∗
5
1
∗
2
+
2
∗
4
+
3
∗
6
1
∗
3
+
2
∗
5
+
3
∗
7
1
∗
4
+
2
∗
6
+
3
∗
8
3
∗
1
+
4
∗
3
+
5
∗
5
3
∗
2
+
4
∗
4
+
5
∗
6
3
∗
3
+
4
∗
5
+
5
∗
7
3
∗
4
+
4
∗
6
+
5
∗
8
]
\begin{bmatrix}1*1+2*3+3*5&1*2+2*4+3*6&1*3+2*5+3*7&1*4+2*6+3*8\\3*1+4*3+5*5&3*2+4*4+5*6&3*3+4*5+5*7&3*4+4*6+5*8\end{bmatrix}
[1∗1+2∗3+3∗53∗1+4∗3+5∗51∗2+2∗4+3∗63∗2+4∗4+5∗61∗3+2∗5+3∗73∗3+4∗5+5∗71∗4+2∗6+3∗83∗4+4∗6+5∗8]
即
[
22
28
34
40
40
52
64
76
]
\begin{bmatrix}22&28&34&40\\40&52&64&76\end{bmatrix}
[2240285234644076](啊真是难算)
矩阵乘法满足
A
(
B
C
)
=
(
A
B
)
C
(
A
+
B
)
C
=
A
C
+
B
C
C
(
A
+
B
)
=
A
C
+
B
C
A(BC)=(AB)C\\(A+B)C=AC+BC\\C(A+B)=AC+BC
A(BC)=(AB)C(A+B)C=AC+BCC(A+B)=AC+BC
特别地,当
A
,
B
A,B
A,B为方阵时,
A
B
=
B
A
AB=BA
AB=BA
板子
int n, m, p;
struct Matrix{
int n, m;
long long A[101][101];
inline Matrix() { memset(A, 0, sizeof A); }
inline void input() {
for(reg int i = 1; i <= n; i++)
for(reg int j = 1; j <= m; j++) cin >> A[i][j];
}
inline void output() {
for(reg int i = 1; i <= n; i++) {
for(reg int j = 1; j <= m; j++) {
cout << A[i][j];
if(j != m) cout << ' ';
}
cout << endl;
}
}
inline Matrix operator * (const Matrix&rhs) {
Matrix ans;
ans.n = n; ans.m = rhs.m;
for(reg int i = 1; i <= n; i++)
for(reg int j = 1; j <= rhs.m; j++)
for(reg int k = 1; k <= m; k++)
ans.A[i][j] += A[i][k] * rhs.A[k][j];
return ans;
}
}a, b;
int main() {
ios::sync_with_stdio(false);
cin.tie(); cout.tie();
cin >> n >> m;
a.n = n; a.m = m;
a.input();
cin >> p;
b.n = m; b.m = p;
b.input();
Matrix c = a * b;
c.output();
}