Skip to content

线性代数与数值优化基础

本文旨在对线性代数及其在数值计算、图形应用中的关键概念进行系统性梳理。通过构建直观的几何理解,并结合具体的代码实现,打通从基础理论到工程应用的知识链条。


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 图像压缩应用

图像本质上是一个像素矩阵。由于矩阵前几个最大的奇异值往往占据了绝大部分的能量(信息),我们可以通过只保留前 个奇异值来近似原矩阵,从而实现图像压缩。

python
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 语言实现:

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 分解,再到工程实践中的矩阵存储和拟合代码,可以帮助我们更加扎实地构建代数与计算系统的整体认知。

基于 VitePress 强力驱动 | 记录技术与生活