学会矩阵的"四则运算"。其中矩阵乘法是最重要也最容易搞混的,本章重点讲透。
17.1 矩阵加减:对应元素相加减
两个尺寸相同的矩阵,对应位置的元素相加减:
[ 1 2 ] [ 5 6 ] [ 1+5 2+6 ] [ 6 8 ]
[ 3 4 ] + [ 7 8 ] = [ 3+7 4+8 ] = [ 10 12 ]
规则:同行同列的元素相加。减法同理。
17.2 数乘:每个元素都乘一个数
一个标量乘矩阵,等于矩阵每个元素都乘这个标量:
[ 1 2 ] [ 2 4 ]
2 × [ 3 4 ] = [ 6 8 ]
17.3 转置:行列互换
转置(transpose) 把矩阵"沿对角线翻转":行变列、列变行。
[ 1 2 3 ] [ 1 4 ]
A = [ 4 5 6 ] Aᵀ = [ 2 5 ]
[ 3 6 ]
第 i 行变成第 i 列。A 的转置记作 Aᵀ(或 A.transpose())。
对称矩阵就是"转置等于自己"的矩阵(Aᵀ = A)。
17.4 点积(内积):两个向量的"相似度"
两个同维向量的点积(dot product):对应分量相乘再求和。
(1, 2, 3) · (4, 5, 6) = 1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32
点积的意义:
- 点积 = 0,两个向量垂直(正交)
- 点积 = 两向量长度乘积,则同向
- 点积 < 0,方向大致相反
点积是衡量"两个向量有多像"的工具,在机器学习、物理里无处不在。
17.5 矩阵乘法(重点!)
这是最重要的运算,规则需要记牢。
规则
两个矩阵 A(m×n)和 B(n×p)相乘,得到 C(m×p):
- A 的列数必须等于 B 的行数(都是 n)
- 结果 C 的第 i 行第 j 列 = A 的第 i 行 与 B 的第 j 列 的点积
例子
A = [ 1 2 ] B = [ 5 6 ]
[ 3 4 ] [ 7 8 ]
A 是 2×2,B 是 2×2,结果 C 是 2×2。
算 C(0,0):A 第 1 行 (1,2) · B 第 1 列 (5,7) = 1×5 + 2×7 = 19
算 C(0,1):A 第 1 行 (1,2) · B 第 2 列 (6,8) = 1×6 + 2×8 = 22
算 C(1,0):A 第 2 行 (3,4) · B 第 1 列 (5,7) = 3×5 + 4×7 = 43
算 C(1,1):A 第 2 行 (3,4) · B 第 2 列 (6,8) = 3×6 + 4×8 = 50
C = [ 19 22 ]
[ 43 50 ]
矩阵 × 向量
向量是"只有一列的矩阵",所以矩阵乘向量是矩阵乘法的特殊情况:
[ 1 2 ] [ 1 ] [ 1×1 + 2×1 ] [ 3 ]
[ 3 4 ] × [ 1 ] = [ 3×1 + 4×1 ] = [ 7 ]
矩阵乘向量 = 对向量做一次"变换"(第 21 章会展开,这是理解几何的关键)。
关键性质:不满足交换律!
矩阵乘法不满足交换律:A×B ≠ B×A(大多数情况下)。
而且顺序影响尺寸:2×3 乘 3×4 可以(得 2×4),但 3×4 乘 2×3 不行(列数不等于行数)。
记忆:矩阵乘法"左矩阵的列 = 右矩阵的行"才能乘;结果尺寸 = “左行 × 右列”。
17.6 在 Eigen 里做矩阵运算
#include <Eigen/Dense>
#include <iostream>
int main() {
Eigen::Matrix2d A, B;
A << 1, 2,
3, 4;
B << 5, 6,
7, 8;
std::cout << "A + B =\\n" << A + B << "\\n\\n"; // 对应相加
std::cout << "2 * A =\\n" << 2 * A << "\\n\\n"; // 数乘
std::cout << "A * B =\\n" << A * B << "\\n\\n"; // 矩阵乘法
std::cout << "A^T =\\n" << A.transpose() << "\\n\\n"; // 转置
Eigen::Vector3d u(1, 2, 3), v(4, 5, 6);
std::cout << "点积 = " << u.dot(v) << "\\n"; // 32
return 0;
}
存成 ch17.cpp,按附录 C.3 编译运行,实际输出:
A + B =
6 8
10 12
2 * A =
2 4
6 8
A * B =
19 22
43 50
A^T =
1 3
2 4
点积 = 32
A * B 得到 19 22 / 43 50,正好等于你上面手算的结果——矩阵乘法的算法和代码是一一对应的。你可以顺手加一句 std::cout << B * A << "\\n";,看到 B * A 是 23 34 / 31 46,和 A * B 不同,交换律不成立这件事就亲眼确认了。
注意 Eigen 的 *:A * B 是矩阵乘法(不是逐元素乘)。想逐元素相乘要用 .array()(第 27 章)。这是新手最容易搞错的地方。
17.7 小结
- 加减:对应元素相加减(尺寸要相同)。
- 数乘:每个元素乘标量。
- 转置:行列互换。
- 点积:对应分量相乘求和。
- 矩阵乘法:左矩阵列数 = 右矩阵行数,结果(i,j) = 左 i 行点乘右 j 列;不满足交换律。
下一章,用矩阵表示和解线性方程组——矩阵最重要的应用。
网硕互联帮助中心



评论前必须登录!
注册