云计算百科
云计算领域专业知识百科平台

第 17 章 · 矩阵运算

学会矩阵的"四则运算"。其中矩阵乘法是最重要也最容易搞混的,本章重点讲透。

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 列;不满足交换律。

下一章,用矩阵表示和解线性方程组——矩阵最重要的应用。


练习题

  • 计算两个 2×2 矩阵的加减。
  • 手算矩阵乘法:A=[1 2; 3 4],B=[5 6; 7 8],求 A×B 和 B×A,验证交换律不成立。
  • 计算向量 (1,2,3) 和 (4,5,6) 的点积。
  • 求矩阵 [1 2 3; 4 5 6] 的转置。
  • 判断:2×3 矩阵能和 3×2 矩阵相乘吗?结果是多少尺寸?
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 第 17 章 · 矩阵运算
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!