线性代数与数值优化基础
本文旨在对线性代数及其在数值计算、图形应用中的关键概念进行系统性梳理。通过构建直观的几何理解,并结合具体的代码实现,打通从基础理论到工程应用的知识链条。
1. 线性代数核心概念的直观理解
传统线性代数教学常侧重于数值计算与公式推导,但在实际工程应用中,几何直观(Geometric Intuition) 往往是理解和解决问题的关键。
1.1 向量与线性组合
- 向量的本质:在物理学中,向量被看作是空间中具有长度和方向的箭头;在计算机科学中,向量是有序的数字列表;在数学上,向量是只要满足加法与标量乘法规则的任何对象。通过将向量置于坐标系中,我们将这三种视角统一了起来。
- 基(Basis)与张成的空间(Span):空间中的一组向量,如果通过它们的线性组合(即 )能够表示空间中的任意一个向量,那么这组向量就构成了空间的一组“基”。所有可能的线性组合构成的集合称为这组基“张成的空间”。
1.2 线性变换与矩阵
- 线性变换:在几何上,线性变换是保持网格线平行且等距分布,同时保持原点不变的空间映射。
- 矩阵的本质:矩阵仅仅是对线性变换的数值化描述。一个矩阵的各列,实际上记录了变换后新的基向量在原坐标系中的位置。当我们把一个矩阵乘以一个向量时,其实质是在追踪这个向量在新基下的位置。
2. 欧氏空间与度量
在探讨线性代数时,我们常常身处欧氏空间(Euclidean Space)。
2.1 欧氏空间的定义
欧氏空间是在一般线性空间的基础上引入了“内积(Inner Product)”概念的空间。单纯的线性空间缺乏“长度”和“角度”的度量,而引入内积后:
- 我们可以定义向量的长度(范数):。
- 我们可以定义两个向量之间的夹角(通过点积公式 )。
2.2 距离的度量
在欧氏空间中,最常用的距离是欧氏距离(直线距离)。但在不同算法场景中,我们会对比欧氏距离与曼哈顿距离:
- 欧氏距离(L2 距离):两点间直线的最短距离,常用于几何拟合与 ICP 配准。
- 曼哈顿距离(L1 距离):坐标轴上的绝对轴距总和,常用于网格状路径规划与鲁棒滤噪。
3. 矩阵的存储与转换
在图形编程(如 OpenGL 和 Direct3D)中,矩阵在内存中的物理存储方式(行主序与列主序)对程序的正确性至关重要。
3.1 行主序(Row-Major)与列主序(Column-Major)
在二维矩阵转化为一维线性内存地址时:
- 行主序(Row-Major):按行顺序依次存放(如 C/C++ 的多维数组默认存储方式,以及 Direct3D)。
- 列主序(Column-Major):按列顺序依次存放(如 OpenGL 的矩阵存储方式)。
3.2 转换策略
假设矩阵 在内存中以行主序存储,若要传递给使用列主序的 API(如 OpenGL),我们需要对矩阵进行转置(Transpose),因为在内存布局上,行主序矩阵的转置等于列主序矩阵本身。反之亦然。
4. 行列式的几何直观与计算
4.1 几何意义
行列式(Determinant)代表了线性变换对空间的“缩放比例”。
- 二阶行列式表示二维变换后基向量所围成平行四边形的面积缩放率。
- 三阶行列式表示三维变换后基向量所围成平行六面体的体积缩放率。
- 如果行列式为 0,说明空间被压缩到了更低的维度(例如面积变成了线,体积变成了面),此时矩阵不可逆。
4.2 4x4 行列式计算
在图形学中,4x4 矩阵被广泛用于平移、旋转、缩放和投影。计算 4x4 行列式通常采用拉普拉斯展开(代数余子式展开),将其降阶为 4 个 3x3 行列式的计算。
5. SVD 奇异值分解及其应用
奇异值分解(Singular Value Decomposition, SVD)是线性代数中最重要的矩阵分解方法之一,适用于任意大小的矩阵。
5.1 数学定义
任意一个 的矩阵 都可以分解为:
- 是一个 的正交矩阵(左奇异向量)。
- 是一个 的对角矩阵,对角线上的非负实数称为奇异值,且按降序排列。
- 是一个 的正交矩阵(右奇异向量)。
5.2 图像压缩应用
图像本质上是一个像素矩阵。由于矩阵前几个最大的奇异值往往占据了绝大部分的能量(信息),我们可以通过只保留前 个奇异值来近似原矩阵,从而实现图像压缩。
import numpy as np
def compress_image(image_matrix, k):
# 进行奇异值分解
U, S, VT = np.linalg.svd(image_matrix, full_matrices=False)
# 取前 k 个奇异值重构图像
compressed_matrix = np.dot(U[:, :k], np.dot(np.diag(S[:k]), VT[:k, :]))
return compressed_matrix高阶进阶链接:在三维点云配准与姿态解算中,SVD 被广泛用于 Kabsch 算法求解最佳旋转矩阵 。详见 02-图形学核心数学-从向量矩阵几何变换到最小二乘与SVD.md。
6. 最小二乘法理论与实现
最小二乘法(Least Squares Method)是一种用于数据拟合的最优化技术。它通过最小化误差的平方和,来寻找数据的最佳函数匹配。
6.1 数学原理
对于一组数据点 ,假设存在线性关系 。我们需要求得一组参数 ,使得所有点到该直线的误差平方和最小:
通过对 和 分别求偏导数并令其为 0,可以解出 和 的最优闭式解。
6.2 C 语言实现
以下是最小二乘法拟合 的简单 C 语言实现:
#include <stdio.h>
void least_squares(double x[], double y[], int n, double *a, double *b) {
double sum_x = 0.0, sum_y = 0.0, sum_xy = 0.0, sum_x2 = 0.0;
for (int i = 0; i < n; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x2 += x[i] * x[i];
}
double denominator = n * sum_x2 - sum_x * sum_x;
if (denominator == 0) {
printf("Denominator is zero, cannot solve.\n");
return;
}
*a = (n * sum_xy - sum_x * sum_y) / denominator;
*b = (sum_x2 * sum_y - sum_x * sum_xy) / denominator;
}
int main() {
double x[] = {1.0, 2.0, 3.0, 4.0, 5.0};
double y[] = {2.1, 4.0, 6.1, 8.2, 9.9};
int n = 5;
double a, b;
least_squares(x, y, n, &a, &b);
printf("拟合直线为: y = %f * x + %f\n", a, b);
return 0;
}高阶进阶链接:在多视图几何、点云 ICP 与光束法平差(BA)中,针对带噪超定问题的“抹平偏差”机制被推广为测量平差与正交分解。详见 03-数值优化几何本质-平差机制与正交分解.md。
通过上述知识梳理,从纯理论的向量空间,过渡到可应用于机器视觉的 SVD 分解,再到工程实践中的矩阵存储和拟合代码,可以帮助我们更加扎实地构建代数与计算系统的整体认知。