☰
第 16 章 · 向量与矩阵
2026/10/7 7:48:22 网站建设 项目流程

进入线性代数。别怕,这部分我们重直觉、轻公式,用图形和生活例子讲清楚"向量"和"矩阵"是什么,让你为 Eigen 打好数学基础。

16.1 标量、向量、矩阵

在数学和计算机里,数据常分成三个层次:

概念是什么例子
标量(scalar)一个单独的数温度 36.5、价格 99
向量(vector)一列(或一行)数三维坐标 (x, y, z)
矩阵(matrix)一个二维的数表一张表格
标量: 5 向量: [ 1 ] (3 维列向量) [ 2 ] [ 3 ] 矩阵: [ 1 2 3 ] (2 行 3 列) [ 4 5 6 ]

16.2 向量:一个"有方向有长度的箭头"

向量最常见的理解是:一个箭头,有方向、有长度。

在二维平面里,向量(3, 4)表示:从原点出发,向右走 3,向上走 4,画出的箭头。

↑ | · (3,4) | / | / ← 这个箭头就是向量 (3,4) |/______ 原点

向量的两个关键属性:

  • 长度(模/范数):箭头的长短。(3,4)的长度是 √(3²+4²) = 5(勾股定理)。
  • 方向:箭头指向哪。

向量的应用

向量无处不在:

  • 物理:速度、力、加速度
  • 计算机图形:三维空间里的点、方向、颜色
  • 机器学习:一个样本的特征(如 [身高, 体重, 年龄])
  • 机器人:位置、朝向

16.3 向量的表示

一个 n 维向量就是 n 个数排成一列(或一行)。

列向量(竖着):

v = [ 1 ] [ 2 ] [ 3 ]

行向量(横着):

v = [ 1 2 3 ]

在 Eigen 里,Vector3d是列向量(3 行 1 列),RowVector3d是行向量(1 行 3 列)。默认说的"向量"通常指列向量。

16.4 矩阵:一个二维数表

矩阵(matrix)是排成行列的数表。

A = [ 1 2 3 ] ← 2 行 3 列 [ 4 5 6 ]
  • 说"2×3 矩阵",指 2 行、3 列(行在前,列在后)。
  • 每个数叫元素,位置用(行,列)表示,如第 1 行第 2 列是 2。

矩阵的应用

矩阵本质是"批量处理数据的工具":

  • 图片:一张灰度图就是一个矩阵,每个元素是像素亮度
  • 数据表:100 个样本 × 10 个特征,就是一个 100×10 矩阵
  • 变换:旋转、缩放、平移都能用矩阵表示(第 21 章)
  • 方程组:线性方程组的系数可以写成矩阵(第 18 章)

16.5 特殊的矩阵

方阵

行数 = 列数的矩阵,如 3×3。方阵才能求行列式、逆、特征值。

[ 1 2 3 ] [ 4 5 6 ] ← 3×3 方阵 [ 7 8 9 ]

单位矩阵 I

对角线全 1、其余全 0 的方阵。它相当于数字里的 “1”:任何矩阵乘以它都等于自己。

I = [ 1 0 0 ] [ 0 1 0 ] [ 0 0 1 ]

零矩阵

所有元素都是 0。

对角矩阵

只有对角线上有非零值,其余都是 0。

对称矩阵

关于对角线对称:第 i 行第 j 列 = 第 j 行第 i 列(转置等于自己,第 17 章讲)。

[ 1 2 3 ] [ 2 5 6 ] ← 对称:A(0,1)=A(1,0)=2,等等 [ 3 6 8 ]

对称矩阵在物理、机器学习里特别常见,Eigen 对它有专门的高效算法。

16.6 维度与索引

  • 向量(1, 2, 3)是 3 维的,有 3 个分量。
  • 矩阵2×3有 2 行 3 列。

注意:计算机里索引从 0 开始(第 7 章讲过)。数学里矩阵第 1 行第 1 列,在代码里是m(0,0)。这是用 Eigen 时最要小心的一点。

16.7 在 Eigen 里创建向量和矩阵

先睹为快,看 Eigen 怎么表示它们(第 24 章详解):

#include<Eigen/Dense>Eigen::Vector3dv(1,2,3);// 3 维向量Eigen::Matrix3d m;// 3x3 矩阵m<<1,2,3,4,5,6,7,8,9;

16.8 本章完整示例

把上面的片段装进一个完整程序(存成ch16.cpp,按附录 C.3 编译):

#include<Eigen/Dense>#include<iostream>intmain(){Eigen::Vector3dv(1,2,3);// 3 维向量(列向量)Eigen::Matrix3d m;// 3x3 矩阵m<<1,2,3,4,5,6,7,8,9;std::cout<<"向量 v =\n"<<v<<"\n";std::cout<<"矩阵 m =\n"<<m<<"\n";std::cout<<"v 的维度:"<<v.rows()<<" x "<<v.cols()<<"\n";std::cout<<"m 的维度:"<<m.rows()<<" x "<<m.cols()<<"\n";std::cout<<"m(0,1) = "<<m(0,1)<<"(第 1 行第 2 列)\n";std::cout<<"m(2,2) = "<<m(2,2)<<"(第 3 行第 3 列)\n";return0;}

运行结果:

向量 v = 1 2 3 矩阵 m = 1 2 3 4 5 6 7 8 9 v 的维度:3 x 1 m 的维度:3 x 3 m(0,1) = 2(第 1 行第 2 列) m(2,2) = 9(第 3 行第 3 列)

注意向量的维度是3 x 1(三行一列)——这正是 16.3 说的"列向量"。m(0,1)取到的却是数学上"第 1 行第 2 列"那个元素,代码的下标从 0 开始,这个差异第 25 章还会再强调。

16.9 小结

  • 标量 = 一个数,向量 = 一列数,矩阵 = 二维数表。
  • 向量是"有方向有长度的箭头",有长度(范数)和方向。
  • 矩阵是批量处理数据的工具,尺寸用"行×列"表示。
  • 特殊矩阵:单位矩阵 I、零矩阵、对角矩阵、对称矩阵。

下一章,学习矩阵的运算:加减、数乘、矩阵乘法、转置。


练习题

  1. 画一个二维向量 (3,4),计算它的长度。
  2. 写出一个 3×3 的单位矩阵。
  3. 判断:一个 2×3 矩阵有多少行、多少列、多少个元素?
  4. 举例说明向量和矩阵各有什么实际应用。
  5. 一个 5 维向量[1,2,3,4,5],用代码的下标(从 0 开始)取它的第 3 个数,下标应该写几?取到的值是几?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询