3.5 线性代数相关的函数
本小节我们将介绍 MATLAB 在线性代数中的一些常用函数, 以下内容大多仅涉及到初等线性代数的知识,大家可以查阅线性代数的书籍复习相关概念。
函数名 | 功能 |
det | 计算方阵的行列式(determinant) |
rank | 计算矩阵的秩 |
trace | 计算方阵的迹(对角线元素的和) |
rref | 将矩阵变换成行最简型矩阵(Reduced row echelon form 简化行阶梯形) |
inv | 计算方阵的逆矩阵(inverse matrix), inv(X)的结果和 X^(-1)相同 |
transpose | 返回转置矩阵(有复数的话转置后虚部符号保持不变),transpose(A)和 A.'的结果相同 |
triu | 返回矩阵的上三角部分,triangle(三角形) + upper(高、 上方) |
tril | 返回矩阵的下三角部分,triangle(三角形) + lower(低、下方) |
eig | 计算方阵的特征值和特征向量(eigenvalue and eigenvector) |
norm | 计算向量或者矩阵的范数(这个概念大家可能没接触过,它在机器学习中用的较多) |
1.det,rank,trace,rref,inv,transpose函数
最前面的六个函数都很简单,我们直接来看例子:
2.triu 函数和 tril 函数(可用于对称矩阵的构造)
triu 函数和 tril 函数用法相同,可分别用来返回矩阵的上三角部分和下三角部分。
- triu(A,k)返回 A 的第 k 条对角线上以及该对角线上方的元素,其他位置元素用 0 填充, k 等于 0 时可以简写成 triu(A)。
- tril(A,k)返回 A 的第 k 条对角线上以及该对角线下方的元素,其他位置元素用 0 填充, k 等于 0 时可以简写成 tril(A)。
默认值 k = 0 是主对角线, k > 0 位于主对角线上方,而 k < 0 位于主对角线下方。
下面我们用这两个函数来做一个有趣的练习题:生成一个 n 阶(例如 n=4)的对称矩阵, 里面的每个元素都是位于区间[0, 9]中的随机整数。
这几行代码综合性非常强, 核心的思路就是将这个对称矩阵分成三个部分: 首先随机生成 对称矩阵的上半部分(不包括主对角线),这是一个上三角矩阵; 然后将其转置来确保矩阵的 元素是对称的;最后使用 diag 函数生成一个随机的对角矩阵。将上半部分、下半部分以及对 角矩阵相加即可得到这个对称矩阵。
具体代码的解释如下: 对于一个 n 阶的对称矩阵, 它的上三角部分(不包括主对角线) 有 n*(n- 1)/2 个元素,上方代码中将其赋值给 num;矩阵 A 初始化为一个 n 阶全为 0 的矩阵;true(n) 创建了一个 n 阶的逻辑矩阵,其中所有元素都为逻辑值 1;triu(true(n),1)返回了一个不包括主对角线的上三角的逻辑矩阵, 我们用它对 A 矩阵进行逻辑索引; randi([0,9],num,1)生成了一个 有 num 个元素的向量,其中每个元素都是位于区间[0, 9]中的随机整数; A(triu(true(n),1))选取 了矩阵 A 的上三角部分(不包括主对角线),然后将其赋值为随机生成的整数; A'是矩阵 A 的 转置,由于我们已经填充了 A 的上三角部分,将它转置我们可以确保下三角部分与上三角部分是对称的; diag(randi([0,9],n,1))生成了一个主对角线上的元素为区间[0, 9]中的随机整数, 而 其它地方都为 0 的 n 阶矩阵;将这三个矩阵相加,即可得到最终的对称矩阵。
以后我们学了循环语句后, 还可以利用循环语句生成, 虽然循环语句更直观且代码易于编 写,但直接基于矩阵操作在 MATLAB 中通常更高效,尤其是对于大型矩阵。
3.eig 函数
eig 函数可用来计算方阵的特征值和特征向量,它有两种最基础的用法:
- e = eig(A) 返回一个列向量, e 中包含方阵 A 的所有特征值。
- [V,D] = eig(A) 返回特征向量构成的矩阵 V 和特征值构成的对角矩阵 D,V 中的每一 列就是 D 中对应特征值的特征向量。
举个最简单的例子:学过线性代数的同学应该会求矩阵A = 2(1) 1(2)] 的特征值和特征向量, 这是手算的结果: A的两个特征值分别为− 1和3 ,其中− 1对应的特征向量为k1 1] ,3对应的
特征向量为k2 1(1)] ,这里的k1 和k2 均为非零常数。
我们用 MATLAB 来验算下:
有同学会有疑惑, 为什么 MATLAB 算出来的特征向量这么奇怪?特征值-1 对应的特征向 量是[ -0.7071; 0.7071],特征值 3 对应的特征向量是[0.7071; 0.7071]。这是因为特征值对应的特 征向量不是唯一的, 前面可以乘以任意的非零常数。在 MATLAB 中,eig 函数会对特征向量进 行缩放,使得各特征值对应的特征向量的模长均为 1。
再来看个例子:
练习题:请你将上方 A 矩阵的特征值从大到小降序排列,对应的特征向量的顺序也要跟 着特征值的顺序改变。
另外, MATLAB 计算得到的特征值或特征向量可能会有一定的误差, 这是 MATLAB 的浮 点数运算误差导致的,大家以后遇到了有印象即可。
4.norm 函数
下面我们来介绍最后一个函数:norm 函数,它可以用来计算向量或者矩阵的范数。范数这个概念大家可能没听过,它在机器学习中用的较多。
我们这里只介绍向量的范数,假设向量,常用的向量范数有下面三种:
在 MATLAB 中的调用方法分别为: norm(x,1)、norm(x,2)和 norm(x,p)。事实上, 1-范数和 2-范数都属于 p-范数的特例, MATLAB 中 p 默认取 2,即 norm(x)是 norm(x,2)的简写形式, 表 示计算 2-范数。
我们来看几个例子:
事实上,如果你不会 norm 函数,也可以用我们之前的方法计算向量的范数: p-范数等价 于: sum(abs(x).^p) ^ (1/p),这里的 1/p 要加括号。特别地, 将 p 分别取 1 和 2 即可得到 1-范数 和 2-范数。
5.拓展: 范数和距离的联系
(1)欧式距离(Euclidean Distance)
欧式距离是最常见的两点之间距离定义的方法,又被称为欧几里得度量, 它定义于欧几里 得空间中。点和点之间的欧氏距离为:
例如x(1, 2)和y(4, 6)直接计算欧氏距离结果 5,将它们视为向量: x = [1, 2] ,y = [4, 6], 那么作差后x − y = [ − 3, −4],向量[ − 3, −4]对应的 2-范数也为 5,和欧氏距离的结果相同。
(2)曼哈顿距离(Manhattan Distance)
假设城市所有的道路是平行且垂直的,如下图所示,你需要驾车从 X 点到达 Y 点,那么 你的驾驶距离应该如何计算?
你能直接计算 X 和 Y 两点之间的欧式距离作为你的驾驶距离吗?当然不行,除非你乘坐 的飞机。这时候,我们可以使用曼哈顿距离来表示实际的驾驶距离。
点和点之间的曼哈顿距离定义为:
例如x(1, 2)和y(4, 6)直接计算曼哈顿距离结果 7,将它们视为向量作差后得到[ − 3, −4],向 量[ − 3, −4]对应的 1-范数也为 7,和曼哈顿距离的结果相同。
(3)闵可夫斯基距离 (Minkowski Distance)
闵可夫斯基距离(简称为闵氏距离) 不是一种特定的距离, 而是一组距离的定义。 x和y之 间的闵氏距离为:
其中p是一个正数,当p = 1时就是曼哈顿距离,当p = 2时,就是欧氏距离。