进入线性代数。别怕,这部分我们重直觉、轻公式,用图形和生活例子讲清楚"向量"和"矩阵"是什么,让你为 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、零矩阵、对角矩阵、对称矩阵。
下一章,学习矩阵的运算:加减、数乘、矩阵乘法、转置。
练习题
- 画一个二维向量 (3,4),计算它的长度。
- 写出一个 3×3 的单位矩阵。
- 判断:一个 2×3 矩阵有多少行、多少列、多少个元素?
- 举例说明向量和矩阵各有什么实际应用。
- 一个 5 维向量
[1,2,3,4,5],用代码的下标(从 0 开始)取它的第 3 个数,下标应该写几?取到的值是几?