MATLAB中的线性代数函数使用指南

本小节我们将介绍MATLAB在线性代数中的一些常用函数,以下内容大多仅涉及到初等线性代数的知识,大家可以查阅线性代数的书籍复习相关概念。


最前面的六个函数都很简单,我们直接来看例子:


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]中的随机整数。

答案如下:


n   = 4;
num   = n*(n-1)/2;
A   = zeros(n);
A(triu(true(n),1))   = randi([0,9],num,1);
A   = A+A'+diag(randi([0,9],n,1))

% 随机生成的对称矩阵:
     7     6     0     9
     6     3     8     6
     0     8     6     7
     9     6     7     1

这几行代码综合性非常强,核心的思路就是将这个对称矩阵分成三个部分:首先随机生成对称矩阵的上半部分(不包括主对角线),这是一个上三角矩阵;然后将其转置来确保矩阵的元素是对称的;最后使用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中通常更高效,尤其是对于大型矩阵。


eig函数可用来计算方阵的特征值和特征向量,它有两种最基础的用法:

  • e = eig(A) 返回一个列向量,e中包含方阵A的所有特征值。
  • [V,D] = eig(A) 返回特征向量构成的矩阵V和特征值构成的对角矩阵D,V中的每一列就是D中对应特征值的特征向量。

举个最简单的例子:学过线性代数的同学应该会求矩阵 的特征值和特征向量,这是手算的结果:A的两个特征值分别为-1和3,其中-1对应的特征向量为k_1%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bc%7D%0A%09-1%5C%5C%0A%091%5C%5C%0A%5Cend%7Barray%7D%20%5Cright%5D%20,3对应的特征向量为k_2%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bc%7D%0A%091%5C%5C%0A%091%5C%5C%0A%5Cend%7Barray%7D%20%5Cright%5D%20,这里的k_1k_2%0A均为非零常数。

我们用MATLAB来验算下:


有同学会有疑惑,为什么MATLAB算出来的特征向量这么奇怪?特征值-1对应的特征向量是[ -0.7071; 0.7071],特征值3对应的特征向量是[0.7071; 0.7071]。这是因为特征值对应的特征向量不是唯一的,前面可以乘以任意的非零常数。在MATLAB中,eig函数会对特征向量进行缩放,使得各特征值对应的特征向量的模长均为1。

再来看个例子:


练习题:请你将上方A矩阵的特征值从大到小降序排列,对应的特征向量的顺序也要跟着特征值的顺序改变。

答案如下:


[V, D] = eig(A)
e = diag(D);  % 取出特征值
[sort_e, ind] = sort(e, 'descend');  % 将特征值降序排列
D_new = diag(sort_e)
V_new = V(:, ind)

计算结果如下:


另外,MATLAB计算得到的特征值或特征向量可能会有一定的误差,这是MATLAB的浮点数运算误差导致的,大家以后遇到了有印象即可。

下面我们来介绍最后一个函数:norm函数,它可以用来计算向量或者矩阵的范数。范数这个概念大家可能没听过,它在机器学习中用的较多。

我们这里只介绍向量的范数,假设向量x%3D%5Bx_1%2Cx_2%2C%E2%8B%AF%2Cx_n%20%5D,常用的向量范数有下面三种:

1-范数:%5Cleft%5C%7C%20x%20%5Cright%5C%7C%20_1%3D%5Csum_%7Bi%3D1%7D%5En%7B%5Cleft%7C%20x_i%20%5Cright%7C%7D, 即对x的元素求绝对值后再求和。

2-范数:%5Cleft%5C%7C%20x%20%5Cright%5C%7C%20_2%3D%5Csqrt%7B%5Csum_%7Bi%3D1%7D%5En%7Bx_%7Bi%7D%5E%7B2%7D%7D%7D, 即对x的元素求平方后再求和,然后再开方。

p-范数:%5Cleft%5C%7C%20x%20%5Cright%5C%7C%20_p%3D%5Cleft(%20%5Csum_%7Bi%3D1%7D%5En%7B%5Cleft%7C%20x_i%20%5Cright%7C%5Ep%7D%20%5Cright)%20%5E%7B%5Cfrac%7B1%7D%7Bp%7D%7D,即对x元素的绝对值求p次方,再求和,最后再算1/p次幂。

在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-范数。

拓展:范数和距离的联系

(1)欧式距离(Euclidean Distance)

欧式距离是最常见的两点之间距离定义的方法,又被称为欧几里得度量,它定义于欧几里得空间中。点x%3D(x_1%2Cx_2%2C%E2%8B%AF%2Cx_n%20)和点y%3D(y_1%2Cy_2%2C%E2%8B%AF%2Cy_n%20)之间的欧氏距离为:

d_%7Bx%2Cy%7D%5E%7B%5Ctext%7B%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB%7D%7D%3D%5Csqrt%7B%5Cleft(%20x_1-y_1%20%5Cright)%20%5E2%2B%5Cleft(%20x_2-y_2%20%5Cright)%20%5E2%2B%5Ccdots%20%2B%5Cleft(%20x_n-y_n%20%5Cright)%20%5E2%7D%0A%5C%5C%0A%3D%5Csqrt%7B%5Csum_%7Bi%3D1%7D%5En%7B%5Cleft(%20x_i-y_i%20%5Cright)%20%5E2%7D%7D

显然,把x和y视为两个向量,则d_%7Bx%2Cy%7D%5E%7B%5Ctext%7B%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB%7D%7D%3D%5Cleft%5C%7C%20x-y%20%5Cright%5C%7C%20_2.(将x和y向量作差后计算2-范数)

例如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%3D(x_1%2Cx_2%2C%E2%8B%AF%2Cx_n%20)和点y%3D(y_1%2Cy_2%2C%E2%8B%AF%2Cy_n%20)之间的曼哈顿距离定义为:

d_%7Bx%2Cy%7D%5E%7B%5Ctext%7B%E6%9B%BC%E5%93%88%E9%A1%BF%E8%B7%9D%E7%A6%BB%7D%7D%3D%5Cleft%7C%20x_1-y_1%20%5Cright%7C%2B%5Cleft%7C%20x_2-y_2%20%5Cright%7C%2B%5Ccdots%20%2B%5Cleft%7C%20x_n-y_n%20%5Cright%7C%0A%5C%5C%0A%3D%5Csum_%7Bi%3D1%7D%5En%7B%5Cleft%7C%20x_i-y_i%20%5Cright%7C%7D

把x和y视为两个向量,则d_%7Bx%2Cy%7D%5E%7B%5Ctext%7B%E6%9B%BC%E5%93%88%E9%A1%BF%E8%B7%9D%E7%A6%BB%7D%7D%3D%5Cleft%5C%7C%20x-y%20%5Cright%5C%7C%20_1.(将x和y向量作差后计算1-范数)

例如x(1, 2)和y(4, 6)直接计算曼哈顿距离结果7,将它们视为向量作差后得到[-3,-4],向量[-3,-4]对应的1-范数也为7,和曼哈顿距离的结果相同。


(3)闵可夫斯基距离 (Minkowski Distance)

闵可夫斯基距离(简称为闵氏距离)不是一种特定的距离,而是一组距离的定义。x和y之间的闵氏距离为:

d_%7Bx%2Cy%7D%5E%7B%5Ctext%7B%E9%97%B5%E5%BC%8F%E8%B7%9D%E7%A6%BB%7D%7D%3D%5Cleft(%20%5Cleft%7C%20x_1-y_1%20%5Cright%7C%5Ep%2B%5Cleft%7C%20x_2-y_2%20%5Cright%7C%5Ep%2B%5Ccdots%20%2B%5Cleft%7C%20x_n-y_n%20%5Cright%7C%5Ep%20%5Cright)%20%5E%7B%5Cfrac%7B1%7D%7Bp%7D%7D%0A%5C%5C%0A%3D%5Cleft(%20%5Csum_%7Bi%3D1%7D%5En%7B%5Cleft%7C%20x_i-y_i%20%5Cright%7C%5Ep%7D%20%5Cright)%20%5E%7B%5Cfrac%7B1%7D%7Bp%7D%7D

其中p是一个正数,当p=1时就是曼哈顿距离,当p=2时,就是欧氏距离。

把x和y视为两个向量,则d_%7Bx%2Cy%7D%5E%7B%5Ctext%7B%E9%97%B5%E5%BC%8F%E8%B7%9D%E7%A6%BB%7D%7D%3D%5Cleft%5C%7C%20x-y%20%5Cright%5C%7C%20_p.(将x和y向量作差后计算p-范数)



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空