线性代数学习笔记
前置知识
向量:既有大小又有方向的量称为向量。
1.矩阵
1.1定义和性质:
由$ n \times m $ 个数字构成的n行m列的数表
$$
\begin{pmatrix}
a_{11} & a_{12} & a_{13} & \cdot\cdot\cdot & a_{1m}\
a_{21} & a_{22} & a_{23} & \cdot\cdot\cdot & a_{2m}\
a_{31} & a_{32} & a_{33} & \cdot\cdot\cdot & a_{3m}\
\cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot\
a_{n1} & a_{n2} & a_{n3} & \cdot\cdot\cdot & a_{nm}
\end{pmatrix}
$$
其中 $ a_{ij} $表示 元素$a$ 在第$i$行第$j$列
矩阵中的元素为实数的为实矩阵,相应的,矩阵中的元素为复数的为复矩阵
行数和列数都为$n$的称为$n$阶矩阵或$n$阶方阵
由元素$a_{ii}$构成的斜线是矩阵的主对角线$(a_{11} \quad a_{22}\quad \cdot\cdot\cdot)$
由元素$a_{ij}$构成的斜线是矩阵的辅对角线,其中$i+j=n+1$
一般记$\bm{I}$为单位矩阵。单位矩阵满足行列数相同,主对角线上的值为1,其余部分全为0。
单位矩阵有一条重要的性质,对于任意矩阵$\bm{A}$,存在:
$$
A \times I=A
$$
$$
I \times A=A
$$
对于一个矩阵$A$,它的逆矩阵$P$为
$$
P \times A=I
$$
1.2矩阵的基本运算:
矩阵的运算包括加减、数乘、转置、共轭、矩阵乘法
矩阵的加减法是逐个元素进行的,即:
$$
A=
\begin{pmatrix}
a_{11} & a_{12} & a_{13} & \cdot\cdot\cdot & a_{1m}\
a_{21} & a_{22} & a_{23} & \cdot\cdot\cdot & a_{2m}\
a_{31} & a_{32} & a_{33} & \cdot\cdot\cdot & a_{3m}\
\cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot\
a_{n1} & a_{n2} & a_{n3} & \cdot\cdot\cdot & a_{nm}
\end{pmatrix}
$$
$$
B=
\begin{pmatrix}
b_{11} & b_{12} & b_{13} & \cdot\cdot\cdot & b_{1m}\
b_{21} & b_{22} & b_{23} & \cdot\cdot\cdot & b_{2m}\
b_{31} & b_{32} & b_{33} & \cdot\cdot\cdot & b_{3m}\
\cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot\
b_{n1} & b_{n2} & b_{n3} & \cdot\cdot\cdot & b_{nm}
\end{pmatrix}
$$
$$
A \pm B=
\begin{pmatrix}
a_{11} \pm b_{11} & a_{12} \pm b_{12} & a_{13} \pm b_{13} & \cdot\cdot\cdot & a_{1m} \pm b_{1m}\
a_{21} \pm b_{21} & a_{22} \pm b_{22} & a_{23} \pm b_{23} & \cdot\cdot\cdot & a_{2m} \pm b_{2m}\
a_{31} \pm b_{31} & a_{32} \pm b_{32} & a_{33} \pm b_{33} & \cdot\cdot\cdot & a_{3m} \pm b_{3m}\
\cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot\
a_{n1} \pm b_{n1} & a_{n2} \pm b_{n2} & a_{n3} \pm b_{n3} & \cdot\cdot\cdot & a_{nm} \pm b_{nm}\
\end{pmatrix}
$$
矩阵的加减满足交换律和结合律,即:
$$
A+B=B+A
$$
$$
(A+B)+C=A+(B+C)
$$
矩阵的数乘指的是将一个数分别乘到矩阵中去,即:
$$
A \times p=
\begin{pmatrix}
a_{11} \times p & a_{12}\times p & a_{13}\times p & \cdot\cdot\cdot & a_{1m}\times p \
a_{21}\times p & a_{22}\times p & a_{23}\times p & \cdot\cdot\cdot & a_{2m}\times p \
a_{31}\times p & a_{32}\times p & a_{33}\times p & \cdot\cdot\cdot & a_{3m}\times p \
\cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot & \cdot\cdot\cdot\
a_{n1}\times p & a_{n2}\times p & a_{n3}\times p & \cdot\cdot\cdot & a_{nm}\times p
\end{pmatrix}
$$
矩阵的数乘同样满足交换律、结合律和分配律
矩阵的加减和数乘统称为矩阵的“线性运算”
将矩阵$A$的行换成同序号的列所得到的新矩阵称为矩阵$A$的转置矩阵,记作$A'$
例如
$$
A=
\begin{pmatrix}
1 & 2 \
5 & 4 \
-3 & 7 \
0 &-9 \
\end{pmatrix}
$$
则有
$$
A'=
\begin{pmatrix}
1 & 5 &-3 & 0 \
2 & 4 & 7 & -9 \
\end{pmatrix}
$$
显然可以得出转置运算满足
$$
(A')'=A
$$
对于复矩阵,共轭运算的定义为实部不变,虚部取负,即取$\bar{A}$
例如
$$
A=
\begin{pmatrix}
1+i & 2 \
5-i & i \
\end{pmatrix}
$$
则有
$$
\bar{A}=
\begin{pmatrix}
1-i & 2 \
5+i & -i \
\end{pmatrix}
$$
矩阵的乘法当且仅当一个矩阵的行数和另一个矩阵的列数相同时才有意义
记矩阵大小$A=N \times P \quad B=P \times M$
那么对于他们的乘积矩阵$C$的大小为$N \times M$,且有
$$
C_{i,j}=\sum_{k=1}^PA_{i,k}B_{k,j}
$$
即$C$的第$i$行第$j$列的值是即$C$的第$i$行第$j$列的值是$A$的第$i$行$P$个数与$B$的第$j$列$P$个数乘积的和
矩阵乘法满足结合律,但是不满足一般的交换律
朴素算法的矩阵乘法复杂度会达到$O(n^3)$,但是由于其满足结合律的性质,可以通过快速幂对其优化
我们可以通过二维数组模拟矩阵,然后进行矩阵乘法。实现方式可以是重载运算符,也可以是直接模拟。
//重载运算符的方法
struct matrix
{
LL a[100][100];
inline matrix()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=0;
}
matrix operator * (const matrix& T) const
{
matrix res;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
res.a[i][j]+=a[i][k]*T.a[k][j];
return res;
}
matrix operator ^ (LL x) const
{
matrix res,base;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
base.a[i][j]=a[i][j],res.a[i][i]=1;
while(x)
{
if(x&1) res=res*base;
base=base*base;
x>>=1;
}
return res;
}
};
1.3矩阵的应用与习题:
矩阵优化递推的原理是把一个不能用快速幂优化的式子转换成快速幂的形式,这是根据矩阵满足结合律的性质
通过题目可以更好地了解他的应用
T1:斐波那契数列
对于斐波那契数列有递推式
$$
F_n=
\begin{cases}
1 (n \le 2) \
F_{n-1}+F_{n-2} (n \ge 3)
\end{cases}
$$
但是此题数据过大,直接递推复杂度为$O(n)$,必定TLE,这个时候就要用到矩阵加速了。
我们将递推式转化为矩阵乘法
$$C
\begin{bmatrix}
F_n \quad F_{n-1}
\end {bmatrix}
=A
\begin{bmatrix}
F_{n-1} \quad F_{n-2}
\end {bmatrix}
\times
Base
$$
我们只需要解出$Base$就可以得到斐波那契数列矩阵乘法的通项公式
根据矩阵乘法中矩阵大小的计算方法,因为$C=1 \times 2 \quad A=1 \times 2$,容易得出$Base=2 \times 2$
因此可以计算
$$
\because
C_{1,1}=F_{n}=A_{1,1} \times B_{1,1} + A_{1,2} \times B_{2,1}=F_{n-1} \times B_{1,1} + F_{n-2} \times B_{2,1}
$$
$$
\therefore
B_{1,1}=1 \quad B_{2,1}=1
$$
$$
\because
C_{1,2}=F_{n-1}=A_{1,1} \times B_{1,2} + A_{1,2} \times B_{2,2}=F_{n-1} \times B_{1,2} + F_{n-2} \times B_{2,2}
$$
$$
\therefore
B_{1,2}=1 \quad B_{2,2}=0
$$
综上所述
$$
Base=
\begin{bmatrix}
1 & 1 \
1 & 0
\end{bmatrix}
$$
我们只需要定义初始矩阵为
$$
Ans=
\begin{bmatrix}
F_2 \quad F_1
\end {bmatrix}
$$
然后通过
$$
Ans = Ans \times Base^{n-2}
$$
取$Ans_{1,1}$即为答案
回顾上述过程,我们首先通过递推式中的两个过程算出了计算矩阵乘法递推的通项公式,再通过递推式的最初状态进行计算,从而得出最后的答案
在这个过程中我们将递推式中的每一项,即每一次的状态称为状态矩阵(例如T1中的A和C),将用于与状态矩阵相乘的矩阵称为转移矩阵(例如T1中的Base)
通过上面的题可以发现,矩阵乘法加速递推的关键在于定义出状态矩阵,并通过状态矩阵和递推公式构造出转移矩阵,从而运用矩阵乘法和快速幂进行加速。
矩阵乘法加速递推的时间复杂度为$O(n^3 \log T)$,其中$n$为状态矩阵的长度,$T$为递推的总轮数。
使用这种优化方法的题目往往具有以下特点:
1.可以将递推式抽象为一个一维的向量,且每个单位时间进行一次变化
2.递推式的规律可能作用于不同的数据上,但是本身保持不变
3.向量变化时间长,但是向量本身的长度不长
4.递推的形式为线性递推
T2:广义斐波那契数列
这是一道与T1相似的题目
对于斐波那契数列有递推式
$$
F_n=
\begin{cases}
a_1 (n = 1) \
a_2 (n = 2) \
p \times F_{n-1}+q \times F_{n-2} (n \ge 3)
\end{cases}
$$
将递推式转化为矩阵乘法
$$C
\begin{bmatrix}
F_n \quad F_{n-1}
\end {bmatrix}
=A
\begin{bmatrix}
F_{n-1} \quad F_{n-2}
\end {bmatrix}
\times
Base
$$
然后求出状态转移矩阵$Base$
$$
\because
C_{1,1}=F_{n}=A_{1,1} \times B_{1,1} + A_{1,2} \times B_{2,1}=F_{n-1} \times B_{1,1} + F_{n-2} \times B_{2,1}
$$
$$
\therefore
B_{1,1}=p \quad B_{2,1}=q
$$
$$
\because
C_{1,2}=F_{n-1}=A_{1,1} \times B_{1,2} + A_{1,2} \times B_{2,2}=F_{n-1} \times B_{1,2} + F_{n-2} \times B_{2,2}
$$
$$
\therefore
B_{1,2}=1 \quad B_{2,2}=0
$$
综上所述
$$
Base=
\begin{bmatrix}
p & 1 \
q & 0
\end{bmatrix}
$$
然后矩阵乘法加速递推即可
T3:矩阵加速
这是一道模板题,同样与前两道区别不大
对于一个数列$a$有递推式
$$
a_x=
\begin{cases}
1 (x \in \left{1,2,3\right}) \
F_{x-1}+F_{x-3} (x \ge 4)
\end{cases}
$$
通过上面两道题容易抽象出
$$C
\begin{bmatrix}
a_x \quad a_{x-1} \quad a_{x-2}
\end{bmatrix}
=A
\begin{bmatrix}
a_{x-1} \quad a_{x-2} \quad a_{x-3}
\end{bmatrix}
\times
Base
$$
也容易得出$Base=3 \times 3$
再通过同样的方式求出$Base$即可
T4:青蛙王子
题面:某地一湖中有$p(2 \le p \le 10^7)$朵荷花,某一朵荷花上有一个青蛙,现在青蛙开始跳跃,每次必须从一朵荷花跳到另一朵荷花,而且知道青蛙弹跳特别好,它能从任意一朵荷花跳到其他任意$p-1$朵荷花,现在知道青蛙经过$n(2 \le n \le 2^{31}-1)$次跳跃,又回到了最开始的荷花上,问一共有多少种跳法。
题意:青蛙经过n次跳跃后回到原来位置的跳法
设$f_i$表示青蛙经过$i$步回到原来位置的跳法,最后求解$f_n$
青蛙在第$i-1$次跳跃中必然跳到不同于开始跳跃的位置,因此每次跳跃可能到的地方有$p-1$种
再设$g_i$表示青蛙经过$i$步从一朵荷花A跳到另一朵荷花B的总跳法
因此$f_i=(p-1) \times g_{i-1}$
意思是在第$i-1$步可以跳到除原来位置的其他$p-1$朵荷花,然后第$i$步跳回原来的荷花
还有$g_i=f_{i-1}+(p-2) \times g_{i-1}$
意思是分为两种情况,一种是在第$i-1$步跳回原来的荷花A,然后在第$i$步跳到另一朵荷花B,另一种是第$i-1$步没有跳回原来的荷花A,那么青蛙不可能在原来的荷花A,也不可能在“另一朵荷花”B上,所到的荷花总共$p-2$种可能,需要$i-1$步去跳到这些地方,然后在第$i$步跳到另一朵荷花
因为青蛙不可能一步“跳回来”,一步从一朵荷花跳到另一种荷花只有一种情况,因此设置边界$f_1=0 \quad g_1=1$
有了递推式就可以进行加速了
我们依然抽象出一个一维的向量
$$C
\begin{bmatrix}
f_i \quad g_i
\end{bmatrix}
=A
\begin{bmatrix}
f_{i-1} \quad g_{i-1}
\end{bmatrix}
\times
Base
$$
再将上述的递推式带入,算出来
$$
Base=
\begin{bmatrix}
0 & p-1 \
1 & p-2
\end{bmatrix}
$$
与上面题同样的方法算出答案即可
2.高斯消元
2.1原理与应用
高斯消元法用于求解线性方程组
所谓线性方程组就是指一个方程组有多个未知数,但是未知数的次数都为一,也就是我们所熟知的多元一次方程组
对于一个$M$个式子的$N$元方程组,我们可以构建一个$M$行$N+1$列的增广矩阵,$M$行分别对应$M$个方程,前$N$列表示$N$个未知数在每个方程中的系数,第$N+1$列表示每个方程的常数项
2.2传统高斯消元法
传统高斯消元法主要分为两个步骤:加减消元和代入消元
求解方程组的步骤可以概括成对增广矩阵的三类操作:
1.用一个非零的数乘某一行
2.把其中一行的若干倍加到另一行上
3.交换两行的位置
这三类操作称为矩阵的“初等行变换”
例如对于下面的方程
$$
\begin{cases}
x_1+2x_2-x_3=-6 \
2x_1+x_2-3x_3=-9 \
-x_1-x_2+2x_3=7
\end{cases}
$$
可以转换成下面的矩阵
$$
\begin{bmatrix}
1 & 2 & -1 & -6 \
2 & 1 & -3 & -9 \
-1 & -1 & 2 & 7 \
\end{bmatrix}
$$
首先通过加减消元,对于每个未知量$x_i$找到一个$x_i$的系数非零,通过初等行变换用它消掉其他方程中的$x_i$
对于上面的方程矩阵的变化如下
$$
\begin{bmatrix}
1 & 2 & -1 & -6 \
2 & 1 & -3 & -9 \
-1 & -1 & 2 & 7 \
\end{bmatrix}
\Rightarrow
\begin{bmatrix}
1 & 2 & -1 & -6 \
0 & -3 & -1 & 3 \
-1 & -1 & 2 & 7 \
\end{bmatrix}
\Rightarrow
\begin{bmatrix}
1 & 2 & -1 & -6 \
0 & -3 & -1 & 3 \
0 & 1 & 1 & 1 \
\end{bmatrix}
$$
$$
\Rightarrow
\begin{bmatrix}
1 & 2 & -1 & -6 \
0 & 1 & 1 & 1 \
0 & -3 & -1 & 3 \
\end{bmatrix}
\Rightarrow
\begin{bmatrix}
1 & 2 & -1 & -6 \
0 & 1 & 1 & 1 \
0 & 0 & 2 & 6 \
\end{bmatrix}
\Rightarrow
\begin{bmatrix}
1 & 2 & -1 & -6 \
0 & 1 & 1 & 1 \
0 & 0 & 1 & 3 \
\end{bmatrix}
$$
进行的操作分别是
2式$-$1式 $\times$ 2
3式$+$1式
交换1式和2式的位置
3式$+$2式$\times$3
3式$\div$2
最后所得到的矩阵被称为阶梯形矩阵,其系数矩阵被称为上三角矩阵
这个矩阵所表达的方程式为
$$
\begin{cases}
x_1+2x_2-x_3=-6 \
x_2+x_3=1 \
x_3=3
\end{cases}
$$
因为已经知道了最后一个未知量的值,下一步进行代入消元,从下往上以此代回方程组,将矩阵进一步化简,就可以得到每个未知量的解
对于上面最后一个矩阵的操作如下
$$
\begin{bmatrix}
1 & 2 & -1 & -6 \
0 & 1 & 1 & 1 \
0 & 0 & 1 & 3 \
\end{bmatrix}
\Rightarrow
\begin{bmatrix}
1 & 2 & 0 & -3 \
0 & 1 & 0 & -2 \
0 & 0 & 1 & 3 \
\end{bmatrix}
\Rightarrow
\begin{bmatrix}
1 & 0 & 0 & 1 \
0 & 1 & 0 & -2 \
0 & 0 & 1 & 3 \
\end{bmatrix}
$$
对应的未知数的解为
$$
\begin{cases}
x_1=1 \
x_2=-2 \
x_3=3
\end{cases}
$$
在高斯消元的过程中往往还会出现特殊的情况
例如某一个式子化简完之后可能会出现$0=d$,其中$d$为一个非零常数,这代表某些方程之间存在矛盾,因此方程组无解
也有一些方程可能会出现找不到一个$x_i$的系数非零,但$x_1 \sim x_{i-1}$的系数都是零,这种情况意味着方程组有无穷多个解
例如下面的方程组
$$
\begin{bmatrix}
1 & 2 & 0 & 4 \
0 & 0 & 1 & 1 \
0 & 0 & 0 & 0
\end{bmatrix}
\Rightarrow
\begin{cases}
x_1+2x_2=4 \
x_3=1
\end{cases}
$$
对其进行移项可以发现
$$
\begin{cases}
x_1=4-2x_2 \
x_3=1
\end{cases}
$$
对于任意一个$x_2$值,都可以计算出一个相应的$x_1$且符合原方程组
我们称$x_1$和$x_3$这类未知量为主元,称$x_2$这类未知量为自由元
在完成高斯消元后我们可以重新扫描一遍矩阵,若存在系数全为零而常数不为零的行,则方程组无解;若所有行的系数都不全为零,则方程组有唯一的解;若系数不全为零的行有$k$行,矩阵总共有$n$行$(k<n)$,则方程组有无穷多个解,其中主元有$k$个,自由元有$n-k$个
$Code$
#include<bits/stdc++.h>
using namespace std;
double a[110][110]; //增广矩阵
double ans[110]; //方程的解
double eps=1e-7;
int n;
double fabs(double a)
{
return (a>0)?a:(-a);
}
int Gauss()
{
int x,y;
for(x=1,y=1;x<=n,y<=n;x++,y++) //目前处理到的行和列
{
//寻找当前找的未知数系数最大的那一行并交换
int maxx=x;
for(int i=x+1;i<=n;i++)
if(abs(a[i][y])>abs(a[maxx][y]))
maxx=i;
if(x!=maxx) swap(a[x],a[maxx]);
//如果这一行及以后全都是零,说明这一个未知数处理完了,处理下一列
if(fabs(a[x][y])<eps)
{
x--;
continue;
}
//加减消元
for(int i=x+1;i<=n;i++) //枚举要消去的行
if(fabs(a[i][y])>eps) //如果这一行该未知数系数不为零则消去它
{
double k=a[i][y]/a[x][y];
for(int j=y;j<=n+1;j++) a[i][j]-=a[x][j]*k; //注意N+1,因为常数项也要消
a[i][y]=0;
}
}
//求解
//无解
for(int i=x;i<=n;i++)
if(a[i][y]>eps)
return 114514;
//无唯一解
if(x<=n) return n+1-x;
//有唯一解
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
a[i][n+1]-=a[i][j]*ans[j];
ans[i]=a[i][n+1]/a[i][i];
}
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
int p=Gauss();
if(p) cout<<"No Solution";
else
for(int i=1;i<=n;i++)
printf("%.2lf\n",ans[i]);
return 0;
}
2.3求矩阵的逆
对于一个$n$阶矩阵$A$,我们可以通过高斯消元法求得矩阵的逆
1.构造一个矩阵$P=n \times 2n=(A,I)$
2.对矩阵$P$进行高斯消元,最后得到$P=(I,A')$
3.若最后得到的矩阵左部分不为$I$,则证明该矩阵不可逆
2.4高斯消元的应用与习题
题目中告诉我们在$n$维空间中对于该球体的球心$I(i_1,i_2,i_3 \cdot \cdot \cdot i_{n+1})$和球上任意的点$A(a_1,a_2,a_3 \cdot \cdot \cdot a_{n+1})$有
$$
R=\sqrt{\left(a_1-i_1\right)2+\left(a_2-i_2\right)2+\left(a_3-i_3\right)^2+ \cdot \cdot \cdot +\left(a_{n+1}-i_{n+1}\right)^2}
$$
这个根号实在是丑陋,我们直接将其提出来
$$
R2=\left(a_1-i_1\right)2+\left(a_2-i_2\right)2+\left(a_3-i_3\right)2+ \cdot \cdot \cdot +\left(a_n-i_n\right)^2
$$
再转换成常见的形式
$$
\sum_{i=1}{n+1}\left(a_{k,i}-i_i\right)2=R^2
$$
这还不是线性方程,原因是总共有$n+1$个$n$元$2$次方程
只需要将相邻的两项相减,就得到$n$个$n$元$1$次方程,同时还能消去常数$R^2$,得到
$$
\sum_{i=1}n\left(a_{k,i}-i_i\right)2-\left(a_{k+1,i}-i_i\right)^2=0
$$
然后展开
$$
\sum_{i=1}na_{k,i}2-a_{k+1,i}^2-2i_i(a_{k,i}-a_{k+1,i})=0
$$
移项
$$
\sum_{i=1}n2i_i(a_{k,i}-a_{k+1,i})=\sum_{i=1}na_{k,i}2-a_{k+1,i}2
$$
这就是一个线性方程,套上刚才的板子直接对其进行高斯消元,即可求出每个$i_i$的值
$Code$
#include<bits/stdc++.h>
using namespace std;
int n;
double a[15][15],b[15][15],ans[15];
double eps=1e-7;
double fabs(double a)
{
return (a>0)?a:-a;
}
int main()
{
cin>>n;
//读入数据
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
//增广矩阵
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=2*(a[i][j]-a[i+1][j]),b[i][n+1]+=(a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]);
//高斯消元
int x,y;
for(x=1;x<=n;x++)
{
int maxx=x;
for(int i=x+1;i<=n;i++)
if(fabs(b[i][x])>fabs(b[maxx][x]))
maxx=i;
if(maxx!=x) swap(b[maxx],b[x]);
for(int i=x+1;i<=n;i++)
if(fabs(b[i][x])>eps)
{
double k=b[i][x]/b[x][x];
for(int j=x;j<=n+1;j++) b[i][j]-=b[x][j]*k;
}
}
//保证有唯一解 直接求解
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++) b[i][n+1]-=b[j][n+1]*b[i][j];
b[i][n+1]/=b[i][i];
}
for(int i=1;i<=n;i++)
printf("%.3lf ",b[i][n+1]);
return 0;
}
3.线性空间
线性空间
一个封闭的向量集合,包括两个运算
1.向量加法 $a+b$,其中$a$和$b$均为向量
向量加法满足下面两个定则:
1.三角形定则:将各个向量依次按照首位顺序相互连接,最后得出的结果为第一个向量的起点指向最后一个向量的终点
2.平行四边形定则:选择以向量的两个边作为平行四边形,结果是作为公共起点的一个对角线
此外,向量加法满足交换律、结合律和加减变换率。即
$$
\vec{A} + \vec{B} =\vec{B} + \vec{A}
$$
$$
\left(\vec{A} + \vec{B}\right) + \vec{C} =\vec{A} + \left(\vec{B} + \vec{C}\right)
$$
$$
\vec{A} + \left( - \vec{B} \right) = \vec{A} - \vec{B}
$$
2.标量乘法 $k \times a$,其中$a$是向量,$k$是标量
其含义为将向量的值与标量相乘且不改变方向
例如矩阵的数乘就是典型的标量乘法
表出
给定若干个向量$a_1,a_2,a_3\cdot \cdot \cdot a_n$,若向量$b$能被这些向量通过向量加法和标量乘法运算得出,则称向量$b$能被向量$a_1,a_2,a_3\cdot \cdot \cdot a_n$表出
相应的,这些向量$a_1,a_2,a_3\cdot \cdot \cdot a_n$能够表出的所有向量会构成一个线性空间,其中$a_1,a_2,a_3\cdot \cdot \cdot a_n$被称为这个线性空间的生成子集
基
任选出线性空间中的若干向量,若其中存在一个向量可以被其他向量表出,则称这些向量线性相关,否则则称这些向量线性无关
线性无关的生成子集称为线性空间的基
一个线性空间中的所有基所含向量个数都相等,这个数被称为线性空间的维数
秩
对于一个$n$行$m$列的矩阵,每一行都可以看成长度为$m$的向量,称为行向量,这些向量构成的线性空间的维数被称为矩阵的“行秩”;每一列都可以看成长度为$n$的向量,称为列向量,这些向量构成的线性空间的维数被称为矩阵的“列秩”
容易得出矩阵的行秩和列秩是相等的,它们统称为矩阵的秩
计算矩阵的基和秩
将这个$n$行$m$列的矩阵进行高斯消元,得到一个阶梯形矩阵
由于矩阵的“初等行变换”进行的就是向量加法和标量乘法,高斯消元并不能改变矩阵行向量表出的线性空间,因此所有的非零行向量都线性无关
可以得出这个阶梯型矩阵的所有非零行向量是这个矩阵的一个基,非零行向量的个数是这个矩阵的秩
标签:begin,end,cdot,矩阵,笔记,times,学习,线性代数,bmatrix From: https://www.cnblogs.com/LittleTwoawa/p/16621119.html