线性代数:矩阵基本运算

在本文中,我们将介绍矩阵的大部分基本运算,依次是矩阵的加减法、矩阵的标量乘法、矩阵与矩阵的乘法、求转置矩阵,以及深入了解矩阵的行列式运算。本文将不会涉及逆矩阵、矩阵的秩等概念,将来再探讨它们。

矩阵的加减法

矩阵的加法与减法运算将接收两个矩阵作为输入,并输出一个新的矩阵。矩阵的加法和减法都是在分量级别上进行的,因此要进行加减的矩阵必须有着相同的维数。

为了避免重复编写加减法的代码,我们先创建一个可以接收运算函数的方法,这个方法将对两个矩阵的分量分别执行传入的某种运算。然后在加法、减法或者其它运算中直接调用它就行了:class Matrix{

// ...

componentWiseOperation(func, { rows }) {

const newRows = rows.map((row, i) =>

row.map((element, j) => func(this.rows[i][j], element))

)

return new Matrix(...newRows)

}

add(other) {

return this.componentWiseOperation((a, b) => a + b, other)

}

subtract(other) {

return this.componentWiseOperation((a, b) => a - b, other)

}

}

const one = new Matrix(

[1, 2],

[3, 4]

)

const other = new Matrix(

[5, 6],

[7, 8]

)

console.log(one.add(other))

// Matrix { rows: [ [ 6, 8 ], [ 10, 12 ] ] }

console.log(other.subtract(one))

// Matrix { rows: [ [ 4, 4 ], [ 4, 4 ] ] }

矩阵的标量乘法

矩阵的标量乘法与向量的缩放类似,就是将矩阵中的每个元素都乘上标量:class Matrix{

// ...

scaleBy(number) {

const newRows = this.rows.map(row =>

row.map(element => element * number)

)

return new Matrix(...newRows)

}

}

const matrix = new Matrix(

[2, 3],

[4, 5]

)

console.log(matrix.scaleBy(2))

// Matrix { rows: [ [ 4, 6 ], [ 8, 10 ] ] }

矩阵乘法

当 A、B 两个矩阵的维数是兼容的时候,就能对这两个矩阵进行矩阵乘法。所谓维数兼容,指的是 A 的列数与 B 的行数相同。矩阵的乘积 AB 是通过对 A 的每一行与矩阵 B 的每一列计算点积得到:

class Matrix{

// ...

multiply(other) {

if (this.rows[0].length !== other.rows.length) {

throw new Error('The number of columns of this matrix is not equal to the number of rows of the given matrix.')

}

const columns = other.columns()

const newRows = this.rows.map(row =>

columns.map(column => sum(row.map((element, i) => element * column[i])))

)

return new Matrix(...newRows)

}

}

const one = new Matrix(

[3, -4],

[0, -3],

[6, -2],

[-1, 1]

)

const other = new Matrix(

[3, 2, -4],

[4, -3, 5]

)

console.log(one.multiply(other))

// Matrix {

// rows:

// [ [ -7, 18, -32 ],

// [ -12, 9, -15 ],

// [ 10, 18, -34 ],

// [ 1, -5, 9 ] ]}

我们可以把矩阵乘法 AB 视为先后应用 A 和 B 两个线性变换矩阵。为了更好地理解这种概念,可以看一看我们的 linear-algebra-demo。

下图中黄色的部分就是对红色方块应用线性变换 C 的结果。而线性变换 C 就是矩阵乘法 AB 的结果,其中 A 是做相对于 y 轴进行反射的变换矩阵,B 是做剪切变换的矩阵。

如果在矩阵乘法中调换 A 和 B 的顺序,我们会得到一个不同的结果,因为相当于先应用了 B 的剪切变换,再应用 A 的反射变换:

转置

转置矩阵

由公式

定义。换句话说,我们通过关于矩阵的对角线对其进行翻转来得到转置矩阵。需要注意的是,矩阵对角线上的元素不受转置运算影响。class Matrix{

// ...

transpose() {

return new Matrix(...this.columns())

}

}

const matrix = new Matrix(

[0, 1, 2],

[3, 4, 5],

[6, 7, 8],

[9, 10, 11]

)

console.log(matrix.transpose())

// Matrix {

// rows: [

// [ 0, 3, 6, 9 ],

// [ 1, 4, 7, 10 ],

// [ 2, 5, 8, 11 ]

// ]

// }

行列式运算

矩阵的行列式运算将计算矩阵中的所有系数,最后输出一个数字。准确地说,行列式可以描述一个由矩阵行构成的向量的相对几何指标(比如在欧式空间中的有向面积、体积等空间概念)。更准确地说,矩阵 A 的行列式相当于告诉你由 A 的行定义的方块的体积。

矩阵的行列式运算如下所示:

矩阵的行列式运算如下所示:

我们的方法可以计算任意大小矩阵(只要其行列的数量相同)的行列式:class Matrix{

// ...

determinant() {

if (this.rows.length !== this.rows[0].length) {

throw new Error('Only matrices with the same number of rows and columns are supported.')

}

if (this.rows.length === 2) {

return this.rows[0][0] * this.rows[1][1] - this.rows[0][1] * this.rows[1][0]

}

const parts = this.rows[0].map((coef, index) => {

const matrixRows = this.rows.slice(1).map(row => [ ...row.slice(0, index), ...row.slice(index + 1)])

const matrix = new Matrix(...matrixRows)

const result = coef * matrix.determinant()

return index % 2 === 0 ? result : -result

})

return sum(parts)

}

}

const matrix2 = new Matrix(

[ 0, 3],

[-2, 1]

)

console.log(matrix2.determinant())

// 6

const matrix3 = new Matrix(

[2, -3, 1],

[2, 0, -1],

[1, 4, 5]

)

console.log(matrix3.determinant())

// 49

const matrix4 = new Matrix(

[3, 0, 2, -1],

[1, 2, 0, -2],

[4, 0, 6, -3],

[5, 0, 2, 0]

)

console.log(matrix4.determinant())

// 20

行列式可以告诉我们变换时对象被拉伸的程度。因此我们可以将其视为线性变换改变面积的因子。为了更好地理解这个概念,请参考 linear-algebra-demo:

在下图中,我们可以看到对红色的 1×1 方形进行线性变换后得到了一个 3×2 的长方形,面积从 1 变为了 6,这个数字与线性变换矩阵的行列式值相同。

如果我们应用一个剪切变换,可以看到方形会变成一个面积不变的平行四边形。因此,剪切变换矩阵的行列式值等于 1:

如果行列式的值是负数,则说明应用线性变换后,空间被反转了。比如在下图中,我们可以看到变换前

的左边,而变换后

的右边。

如果变换的行列式为 0,则表示它会将所有空间都压缩到一条线或一个点上。也就是说,计算一个给定矩阵的行列式是否为 0,可以判断这个矩阵对应的线性变换是否会将对象压缩到更小的维度去。

在三维空间里,行列式可以告诉你体积缩放了多少:

变换行列式等于 0,意味着原来的空间会被完全压缩成体积为 0 的空间。如前文所说,如果在 2 维空间中变换的行列式为 0,则意味着变换的结果将空间压缩成了一条线或一个点;而在 3 维空间中变换的行列式为 0 意味着一个物体会被压扁成一个平面,如下图所示:

出处:https://juejin.im/post/5d107b00f265da1b67211a21

python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算相关推荐

  1. python做流程管理平台_[译] Airflow: 一个工作流程管理平台

    Airflow: 一个工作流程管理平台 Airbnb 是一个快速增长的.数据启示型的公司.我们的数据团队和数据量都在快速地增长,同时我们所面临的挑战的复杂性也在同步增长.我们正在扩张的数据工程师.数据 ...

  2. python矩阵运算numpy_Python Numpy中的几个矩阵乘法

    数学上的内积.外积和叉积 内积 也即是:点积.标量积或者数量积 从代数角度看,先对两个数字序列中的每组对应元素求积,再对所有积求和,结果即为点积.从几何角度看,点积则是两个向量的长度与它们夹角余弦的积 ...

  3. MATLAB转置矩阵乘,【MATLAB】线性代数矩阵基本运算(转置,乘法,求逆)

    文章目录 创建矩阵 向量转置 矩阵乘法 单位矩阵 矩阵求逆 创建矩阵 MATLAB 提供了许多函数,用于创建各种类型的矩阵.例如,您可以使用基于帕斯卡三角形的项创建一个对称矩阵: A = pascal ...

  4. 【MATLAB】线性代数矩阵基本运算(转置,乘法,求逆)

    文章目录 创建矩阵 向量转置 矩阵乘法 单位矩阵 矩阵求逆 创建矩阵 MATLAB 提供了许多函数,用于创建各种类型的矩阵.例如,您可以使用基于帕斯卡三角形的项创建一个对称矩阵: A = pascal ...

  5. python矩阵运算法则_导数与梯度、矩阵运算性质、科学计算库numpy

    一.实验介绍 1.1 实验内容 虽然在实验一中我想尽量少的引入(会让人放弃继续学习的)数学概念,但我似乎还是失败了.不过这几乎是没有办法的事,要想真正学会深度学习,没有一定的数学基础(高等数学.线性代 ...

  6. 线性代数矩阵行列式_矩阵的行列式 使用Python的线性代数

    线性代数矩阵行列式 In linear algebra, the determinant is a scalar value that can be computed for a square mat ...

  7. 线性代数矩阵行列式_非平方矩阵的行列式| 使用Python的线性代数

    线性代数矩阵行列式 Prerequisites: 先决条件: Defining a Matrix 定义矩阵 Determinant of a Matrix 矩阵的行列式 Note: Determina ...

  8. 机器学习数学基础之Python矩阵运算

    机器学习数学基础之Python矩阵运算 1.在Jupyter中写下Python矩阵基本运算学习记录 1.1 python矩阵操作 1.1.1 首先打开jupyter,引入numpy 1.1.2 创建一 ...

  9. Python中单个下划线“ _”变量的用途是什么?

    这段代码中_ after for的含义是什么? if tbh.bag:n = 0for _ in tbh.bag.atom_set():n += 1 #1楼 下划线_在Python中被视为" ...

最新文章

  1. SAP MM 采购组与采购组织,岂能没有点关系?
  2. 【 MATLAB 】使用 MATLAB 作图讨论有限长序列的 N 点 DFT(强烈推荐)(含MATLAB脚本)
  3. 压缩xvid ffmpeg x264 对比
  4. linux shell学习(一)第一个hello world
  5. python示例异常处理与程序调试_Python错误处理及代码调试方
  6. 2023计算机考研资料分享
  7. (总结)Web性能压力测试工具之Siege详解
  8. 巨量创意signature
  9. 分布式操作系统 - 4.分布式通信管理
  10. 循环队列front==rear
  11. android aoto未解锁,【求教】为什么我的解锁屏幕代码缺无法解锁屏幕
  12. 整理了MariaDB和MySQL数据库历年发布版本和对应关系,方便记忆命令。
  13. Spring Cloud入门-Admin服务监控中心(Hoxton版本),java高级编程技术
  14. 数据挖掘基础:独立性检验
  15. 腾讯1+X云计算 初级考试培训 C
  16. 【Python自动化制作PPT材料(模仿人工操作)】
  17. vb.net 教程 序
  18. ​在沈炜新春致辞中寻找vivo的成功之道
  19. Spring Boot 统一处理全局异常
  20. AMH面板 or 宝塔面板DnsPod动态解析IPv6(Python)

热门文章

  1. python bootstrap 视频_想用Django+ Bootstrap写一个网站, 有哪些比较系统完整的书或者视频可以参考?...
  2. python爬取的内容不是中午_大年初六中午,全国各区县哪里最冷?
  3. 中小学生学python_《中小学生Python编程入门指南》 附录一
  4. numpy.ndarray索引/切片方式
  5. 【每日SQL打卡】​​​​​​​​​​​DAY 2 丨组合两个表【难度简单】
  6. Python 中使用 jsonpath
  7. CompletableFuture详解~thenAcceptBoth
  8. CompletableFuture详解~thenAcceptAsync
  9. Java消息服务~开发者分配的消息头
  10. iBatis 事务控制 与 两表操作将SQL语句写入单表