首页 > 编程知识 正文

线性代数(线性代数矩阵)

时间:2023-05-05 07:30:54 阅读:81243 作者:2901

本文介绍了矩阵的大部分基本运算,包括矩阵的加减法、矩阵的标量乘法、矩阵与矩阵的乘法、求倒排矩阵,深入了解矩阵的行列式运算。 我们不谈逆矩阵、矩阵秩等概念,将来讨论它们。

矩阵的加减法

矩阵的加法和减法接受两个矩阵作为输入,输出新的矩阵。 由于矩阵的加法和减法是在分量级别上进行的,所以要加减的矩阵必须具有相同的维度。

为了避免重复编写加减运算的代码,首先要编写接收运算函数的方法。 该方法对两个矩阵的分量分别执行传递的某种运算。 然后可以通过加法、减法或其他运算直接调用。

类矩阵{2}

//.

组件wiseoperation ((功能,{ rows } ) )。

constnewrows=rows.map((row,I )=

row.map ((元素,j )=函数) this.rows[I][j],元素) )

返回新矩阵(.新矩阵)

}

添加(其他) {

return this.componentwiseoperation ((a,b )=甲乙,乙丙) ) ) ) ) ) ) ) ) ) ) ) ) )。

}

辅助(其他) {

return this.componentwiseoperation ((a,b )=a - b,其他) ) ) ) ) ) ) ) ) ) ) ) ) ) )。

}

}

常数one=新矩阵(

1,2,

3,4

常数之外=新矩阵(

5,6,

7,8

控制台日志(one.add )其他)

//矩阵rows :

控制台日志(other.subtract一个) )

//矩阵rows :

复制代码

矩阵的标量乘法

矩阵的标量乘法类似于向量的缩放。 也就是说,将矩阵中的每个元素乘以标量。

类矩阵{2}

//.

销售者(编号)

constnewrows=this.rows.map (row=

行.映射(元素=元素*编号) )。

返回新矩阵(.新矩阵)

}

}

常数矩阵=新矩阵(

2,3,

4,5

控制台日志(矩阵按比例排列(2) )

//矩阵rows :

如果a、b两个矩阵的维数兼容,则复制码

矩阵乘法

可以对这两个矩阵进行矩阵乘法运算。 的兼容性是指a的列数和b的行数相同。 的积AB通过对a的各行和矩阵b的各列计算点积得到。

类矩阵{2}

//.

多路(其他) {

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

throw new error (Thenumberofcolumnsofthismatrixisnotequaltothenumberofthegivenmatrix.' )

}

常数列=other.columns (

constnewrows=this.rows.map (row=

列.地图(列=求和(行.地图) (元素,I )=元素*列[ I ] )

返回新矩阵(.新矩阵)

}

}

常数one=新矩阵(

3、- 4、

0、- 3、

6、- 2、

- 1,1

常数之外=新矩阵(

3,2,- 4,

4、- 3和5

控制台日志(one .多功能)其他) )

//矩阵

//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 意味着一个物体会被压扁成一个平面,如下图所示:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。