线性代数笔记

发布时间 2023-07-02 23:39:46作者: wsad20

  本文目的:之前零零散散也接触和学习了线代,为了提高对计算机视觉成像与标定的理解。故重新回顾线性代数。后续还会了解线性代数几何意义,以及相机标定原理。这系列文章主要以了解线代知识为主。

基于线性代数及其应用(原书第5版)的笔记

  1线性方程租

 1.1 线性方程租

   形如 a1x1 + a2x2+...+anx= b,系数a已知,n为任意正整数,a为实数或者是复数,满足等式的所有解叫解集,若两个线性方程组解集相同则称两个线性方程组等价。

解集有三种情况 : 1 无解  2有唯一解  3有无穷多解, 举例如下

x1 - x2 + x3 = 0

  2x2 - 8x3 = 8

5x1      -5x3 = 10        

可以将其化为矩阵

[ 1 -1 1

  0  2 -8

  5  0  -5 ] 成为系数矩阵

如果带上等号后面

[ 1 -1 1    0

  0  2 -8   8

  5  0  -5  10]  

就是增广矩阵

矩阵维度即矩阵的行和列,增广矩阵有3行4列。 3行表示3个等式,4列表示有(4-1)个未知数

 求解线性方程租

  求解线性方程组,主要是用初等行变换。 初等行变换有3种  1倍加变换 某一行与另一行的n倍相加  2对等变换 把两行对调  3倍乘变换:某一行所有元素乘以一个非零数。行变换是可逆的,并且行变换不会改变线性方程组的解集。求解过程略,相当于解方程组。每一行都是一个等式,在不改变等式成立的条件下去做化简就可以得到答案。

  接下来的问题就是线性方程组的解是否存在以及以及解有多少个。

  初等行变换可以用矩阵来表达.

对等[ 1  0  0

  0   0  1  

  0  1 0]  将第二行与第三行兑换

倍乘[ 1  0  0

  0  1  0  

  0  0 3] 将第三行乘以三倍

倍加

  [ 1  0  0

  0  1  0  

  3  0 1] 将第三行乘以三倍加到第一行

都是放在矩阵的左边,与矩阵左乘就是初等行变换。与矩阵右乘就是初等列变换。 初等边行变换不改变方阵的秩,但是有可能改变方阵的行列式。

  1.2 行化简与阶梯型矩阵

 行阶梯矩阵定义:

 

 

有自己写的通过高斯消元得到最简行阶梯矩阵,用到opencv库,是一个很简易,仅仅是为了了解高斯消元怎么获得行阶梯矩阵而写的。

void SolveGuass(cv::Mat const& A, cv::Mat const& B, cv::Mat& x ,int slove_type)
{
cv::Mat B_;
if (slove_type == GuassSloveType::SOLVE_AX) {
CV_Assert(A.type() == B.type() && B.cols == 1 && A.rows == B.rows);
B_ = B;
}
else if (slove_type == GuassSloveType::SOLVE_INVERT) {
CV_Assert(A.cols == A.rows);
B_ = cv::Mat::eye(A.size(), A.type());
}
x = cv::Mat::zeros(A.rows,A.cols+B_.cols,A.type());//增广矩阵
A.copyTo(x.colRange(0, A.cols));
B_.copyTo(x.colRange(A.cols,x.cols));
for (int c = 0; c < x.cols-1; c++) {
int majorrow = -1;
for (int r = c; r < x.rows; r++) {
if (majorrow== -1 &&x.at<float>(r,c) != 0) { //选取为主元
if (slove_type != SOLVE_LU) {
x.row(r) /= x.at<float>(r, c);
if (r != c) {
auto temp = x.row(r).clone();
x.row(c).copyTo(x.row(r));
temp.copyTo(x.row(c));
majorrow = c;
}
else {
//不能用LU分解.LU分解仅使用倍加
x = x.zeros(x.rows,x.cols,x.type());
return ;
}
}
majorrow = r;
continue;
}
if (majorrow != -1 && x.at<float>(r,c) != 0) {
x.row(r) -= x.at<float>(r, c) * x.row(majorrow);
}
}
if (majorrow != -1) {
for (int r = 0; r < c; r++) {
x.row(r) -= x.at<float>(r, c) * x.row(majorrow);
}
}
}
}

//整体思路是

1 判断是否符合Ax=B

2 获得增广矩阵

3 获得主元,然后化简。

4 返回值是最简增广矩阵。

1.3 向量方程