【JS 线性代数算法之向量与矩阵】

这篇具有很好参考价值的文章主要介绍了【JS 线性代数算法之向量与矩阵】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线性代数是数学的一个分支,用于研究线性方程组及其解的性质、向量空间及其变换的性质等。在计算机科学领域中,线性代数常用于图形学、机器学习、计算机视觉等领域。本文将详细介绍 JS 中常用的线性代数算法,并提供代码示例。

一、向量的加减乘除

向量是有大小和方向的量,通常用一列数表示。向量的加减乘除运算也是线性代数中的基本运算。

1. 向量加法

向量加法计算两个向量相加的结果。

例如:给定两个二维向量:

a ⃗ = [ 1 2 ] , b ⃗ = [ 3 4 ] \vec{a}=\begin{bmatrix} 1 \\ 2 \end{bmatrix},\vec{b}=\begin{bmatrix} 3 \\ 4 \end{bmatrix} a =[12],b =[34]

则它们的和为:

a ⃗ + b ⃗ = [ 4 6 ] \vec{a}+\vec{b}=\begin{bmatrix} 4 \\ 6 \end{bmatrix} a +b =[46]

代码实现:

function addVectors(a, b) {
  if (a.length !== b.length) return null;
  return a.map((n, i) => n + b[i]);
}

2. 向量减法

向量减法计算两个向量相减的结果。

例如:给定两个三维向量:

a ⃗ = [ 1 3 2 ] , b ⃗ = [ 4 1 5 ] \vec{a}=\begin{bmatrix} 1 \\ 3 \\ 2 \end{bmatrix},\vec{b}=\begin{bmatrix} 4 \\ 1 \\ 5 \end{bmatrix} a = 132 ,b = 415

则它们的差为:

a ⃗ − b ⃗ = [ − 3 2 − 3 ] \vec{a}-\vec{b}=\begin{bmatrix} -3 \\ 2 \\ -3 \end{bmatrix} a b = 323

代码实现:

function subtractVectors(a, b) {
  if (a.length !== b.length) return null;
  return a.map((n, i) => n - b[i]);
}

3. 向量数乘

向量数乘是将一个向量的每个元素乘以一个标量。

例如:给定一个三维向量:

a ⃗ = [ 1 3 2 ] \vec{a}=\begin{bmatrix} 1 \\ 3 \\ 2 \end{bmatrix} a = 132

则它乘以标量 k = 2 k=2 k=2 的结果为:

k a ⃗ = 2 [ 1 3 2 ] = [ 2 6 4 ] k \vec{a}=2\begin{bmatrix} 1 \\ 3 \\ 2 \end{bmatrix}=\begin{bmatrix} 2 \\ 6 \\ 4 \end{bmatrix} ka =2 132 = 264

代码实现:

function scalarMultiply(vector, scalar) {
  return vector.map(n => n * scalar);
}

4. 向量点积

向量点积(也称为内积或数量积)计算两个向量的乘积的和。

例如:给定两个三维向量:

a ⃗ = [ 1 3 2 ] , b ⃗ = [ 4 1 5 ] \vec{a}=\begin{bmatrix} 1 \\ 3 \\ 2 \end{bmatrix},\vec{b}=\begin{bmatrix} 4 \\ 1 \\ 5 \end{bmatrix} a = 132 ,b = 415

则它们的点积为:

a ⃗ ⋅ b ⃗ = 1 × 4 + 3 × 1 + 2 × 5 = 17 \vec{a} \cdot \vec{b}=1 \times 4 + 3 \times 1 + 2 \times 5 = 17 a b =1×4+3×1+2×5=17

代码实现:

function dotProduct(a, b) {
  if (a.length !== b.length) return null;
  return a.reduce((sum, n, i) => sum + n * b[i], 0);
}

5. 向量叉积

向量叉积(也称为外积或向量积)计算两个向量的垂直于它们所在平面的法向量。向量叉积只适用于三维向量。

例如:给定两个三维向量:

a ⃗ = [ 1 3 2 ] , b ⃗ = [ 4 1 5 ] \vec{a}=\begin{bmatrix} 1 \\ 3 \\ 2 \end{bmatrix},\vec{b}=\begin{bmatrix} 4 \\ 1 \\ 5 \end{bmatrix} a = 132 ,b = 415

则它们的叉积为:

a ⃗ × b ⃗ = [ 13 3 − 11 ] \vec{a} \times \vec{b}=\begin{bmatrix} 13 \\ 3 \\ -11 \end{bmatrix} a ×b = 13311

代码实现:

function crossProduct(a, b) {
  if (a.length !== 3 || b.length !== 3) return null;
  const [ax, ay, az] = a;
  const [bx, by, bz] = b;
  return [ay * bz - az * by, az * bx - ax * bz, ax * by - ay * bx];
}

二、矩阵的加减乘除

矩阵是由若干行若干列的数排成的矩形阵列,通常用两个下标表示。矩阵的加减乘除运算也是线性代数中的基本运算。

1. 矩阵加法

矩阵加法计算两个矩阵相加的结果。

例如:给定两个 2 × 2 2 \times 2 2×2 的矩阵:

[ 1 2 3 4 ] , [ 5 6 7 8 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} , \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} [1324],[5768]

则它们的和为:

[ 6 8 10 12 ] \begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix} [610812]

代码实现:

function addMatrices(a, b) {
  if (a.length !== b.length || a[0].length !== b[0].length) return null;
  return a.map((row, i) => row.map((n, j) => n + b[i][j]));
}

2. 矩阵减法

矩阵减法计算两个矩阵相减的结果。

例如:给定两个 3 × 3 3 \times 3 3×3 的矩阵:

[ 1 3 2 4 8 5 6 1 2 ] , [ 2 1 5 3 6 4 1 7 3 ] \begin{bmatrix} 1 & 3 & 2 \\ 4 & 8 & 5 \\ 6 & 1 & 2 \end{bmatrix} , \begin{bmatrix} 2 & 1 & 5 \\ 3 & 6 & 4 \\ 1 & 7 & 3 \end{bmatrix} 146381252 , 231167543

则它们的差为:

[ − 1 2 − 3 1 2 1 5 − 6 − 1 ] \begin{bmatrix} -1 & 2 & -3 \\ 1 & 2 & 1 \\ 5 & -6 & -1 \end{bmatrix} 115226311

代码实现:

function subtractMatrices(a, b) {
  if (a.length !== b.length || a[0].length !== b[0].length) return null;
  return a.map((row, i) => row.map((n, j) => n - b[i][j]));
}

3. 矩阵数乘

矩阵数乘是将一个矩阵的每个元素乘以一个标量。

例如:给定一个 2 × 2 2 \times 2 2×2 的矩阵:

[ 1 3 2 5 ] \begin{bmatrix} 1 & 3 \\ 2 & 5 \end{bmatrix} [1235]

则它乘以标量 k = 2 k=2 k=2 的结果为:

2 × [ 1 3 2 5 ] = [ 2 6 4 10 ] 2 \times \begin{bmatrix} 1 & 3 \\ 2 & 5 \end{bmatrix}=\begin{bmatrix} 2 & 6 \\ 4 & 10 \end{bmatrix} 2×[1235]=[24610]

代码实现:

function scalarMultiplyMatrix(matrix, scalar) {
  return matrix.map(row => row.map(n => n * scalar));
}

4. 矩阵乘法

矩阵乘法计算两个矩阵相乘的结果。矩阵乘法满足结合律,但不满足交换律。即 A × B ≠ B × A A \times B \neq B \times A A×B=B×A

例如:给定两个 2 × 3 2 \times 3 2×3 3 × 2 3 \times 2 3×2 的矩阵:

[ 1 2 3 4 5 6 ] , [ 7 8 9 10 11 12 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} , \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12\end{bmatrix} [142536], 791181012
以下是两个 2×3 和 3×2 矩阵的乘法的 JavaScript 代码示例:

// 2x3 矩阵
const matrixA = [
  [1, 2, 3],
  [4, 5, 6]
];

// 3x2 矩阵
const matrixB = [
  [7, 8],
  [9, 10],
  [11, 12]
];

// 2x2 结果矩阵
const resultMatrix = [
  [0, 0],
  [0, 0]
];

// 矩阵乘法
for (let i = 0; i < 2; i++) {
  for (let j = 0; j < 2; j++) {
    let sum = 0;
    for (let k = 0; k < 3; k++) {
      sum += matrixA[i][k] * matrixB[k][j];
    }
    resultMatrix[i][j] = sum;
  }
}

// 输出结果
console.log(resultMatrix);

输出结果为:

[
  [58, 64],
  [139, 154]
]

上述代码中,我们首先定义了两个矩阵 matrixAmatrixB,然后定义了一个结果矩阵 resultMatrix,该矩阵的大小为 2×2。

接下来,我们通过三层循环实现了矩阵乘法。外层两个循环控制结果矩阵的行列数,内层循环计算结果矩阵中每个元素的值。

最后,我们输出了结果矩阵的值。

常用数学库

在 JavaScript 中实现线性代数算法需要使用数学库,比如 Math.js 或者 NumJS。

以下是 Math.js 的示例代码:

// 创建矩阵
const matrix1 = math.matrix([[1, 2], [3, 4]]);
const matrix2 = math.matrix([[5, 6], [7, 8]]);

// 加法
const addResult = math.add(matrix1, matrix2);
console.log(addResult); // 输出 [[6, 8], [10, 12]]

// 矩阵乘法
const multiplyResult = math.multiply(matrix1, matrix2);
console.log(multiplyResult); // 输出 [[19, 22], [43, 50]]

// 转置
const transposeResult = math.transpose(matrix1);
console.log(transposeResult); // 输出 [[1, 3], [2, 4]]

// 求逆矩阵
const inverseResult = math.inv(matrix1);
console.log(inverseResult); // 输出 [[-2, 1], [1.5, -0.5]]

以上是一些常见的线性代数算法的示例代码。使用数学库可以方便地实现复杂的线性代数计算。文章来源地址https://www.toymoban.com/news/detail-648352.html

到了这里,关于【JS 线性代数算法之向量与矩阵】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数|证明:矩阵不同特征值对应的特征向量线性无关

    定理 1 设 λ 1 , λ 2 , ⋯   , λ m lambda_1,lambda_2,cdots,lambda_m λ 1 ​ , λ 2 ​ , ⋯ , λ m ​ 是方阵 A boldsymbol{A} A 的 m m m 个特征值, p 1 , p 2 , ⋯   , p m boldsymbol{p}_1,boldsymbol{p}_2,cdots,boldsymbol{p}_m p 1 ​ , p 2 ​ , ⋯ , p m ​ 依次是与之对应的特征向量,如果 λ 1 , λ 2 , ⋯   , λ

    2024年02月07日
    浏览(60)
  • 线性代数的学习和整理13: 函数与向量/矩阵

    目录 1 函数与 向量/矩阵 2 初等数学的函数 2.1 函数 2.2 函数的定义:定义域  →映射→  值域 3  高等数学里的函数:定义域和陪域/到达域(非值域)的映射关系 3.1 函数 3.2 单射,满射,双射等都是针对定义域 和 陪域的 3.3 易错地方:值域较小且是被决定的 3.4 单射,满射,

    2024年02月11日
    浏览(66)
  • 线性代数中矩阵的特征值与特征向量

    作者:禅与计算机程序设计艺术 在线性代数中,如果一个$ntimes n$的方阵$A$满足如下两个条件之一: $A$存在实数特征值,即$exists xneq 0:Ax=kx$,其中$kin mathbb{R}$; $lambda_{max}(A)neq 0$($lambda_{max}(A)$表示$A$的最大特征值),且$||x_{lambda_{max}(A)}||=sqrt{frac{lambda_{max}(A)}{lambda_{

    2024年02月08日
    浏览(53)
  • 线性代数(魏福义)——第二章:矩阵及其向量特征

    矩阵 是一个 矩形数表 ,它是研究线性方程组、向量及其变换的重要工具 在数学中,矩阵是一个按照长方形排列的复数或实数集合,它是将一组 有序的数据 视为“ 整体量 ”进行 表述 和 运算 ,从而使问题的表述更加简洁。 2.1.1 矩阵 由 m × n 个数aij排成的 m行n列 的 数表

    2024年02月04日
    浏览(49)
  • NumPy之矩阵、向量、线性代数等的操作

    在NumPy中,矩阵可以看作是一个二维数组,其中每个元素都可以通过行列坐标来定位。它表示为一个m×n的矩形网格,其中m表示矩阵的行数,n表示矩阵的列数。在计算机科学中,矩阵通常用数字或符号表示,并且可以进行加、减、乘等运算。 一个 M X N 的矩阵是一个由 M 行(

    2024年02月02日
    浏览(41)
  • 线性代数(8):特征值、特征向量和相似矩阵

            有矩阵 A 为 n 阶矩阵,Ax = λx ( λ 为一个实数,x为 n 维非零列向量 ),则称 λ 为方阵 A 的特征值, x 为特征向量; 1.2.1 公式         求特征值:使 | A - λE | = 0,其解的 λ 值即为矩阵 A 的特征值;         求特征向量: 使 ( A - λE )x = 0,设 x 为与 A 具有

    2024年02月11日
    浏览(51)
  • 线性代数(五) | 矩阵对角化 特征值 特征向量

    矩阵实际上是一种变换,是一种旋转伸缩变换(方阵) 不是方阵的话还有可能是一种升维和降维的变换 直观理解可以看系列超赞视频线性代数-哔哩哔哩_Bilibili 比如A= ( 1 2 2 1 ) begin{pmatrix}12\\\\21end{pmatrix} ( 1 2 ​ 2 1 ​ ) x= ( 1 2 ) begin{pmatrix}1\\\\2end{pmatrix} ( 1 2 ​ ) 我们给x左乘A实际

    2024年02月04日
    浏览(64)
  • 机器学习——线性代数中矩阵和向量的基本介绍

    矩阵的基本概念(这里不多说,应该都知道) 而向量就是一个特殊的矩阵,即向量只有一列,是个n*1的矩阵 注 :一般矩阵用大写字母表示,向量用小写字母表示 先从简单开始,即一个矩阵和一个向量相乘的运算 矩阵相乘的结果的维度为 m*k 矩阵乘法满足结合律不满足交换律

    2024年02月21日
    浏览(45)
  • 线性代数的学习和整理6:如何表示向量/矩阵? 矩阵就是向量组,矩阵的本质是什么?

    目录 0 参考的知识点和目录 1 向量 1.1 向量的概念 1.2 向量如何表示 1.3 向量/矩阵的优秀表示方法:即向量空间内的有向线段 2 矩阵 2.1 矩阵就是多个列向量的集合/合并( 而不是 +),矩阵就是多个列向量的一种简化书写方式? 2.2 矩阵的加法  =等价于=  向量的加法 2.3 矩阵

    2024年02月07日
    浏览(53)
  • 矩阵的特征与特征向量:线性代数中的魅力

    线性代数是数学的一个分支,它研究的是线性方程组和线性变换。在现实生活中,线性代数广泛应用于各个领域,如物理学、生物学、经济学等。在计算机科学和人工智能领域,线性代数也是一个非常重要的基础知识,它在图像处理、机器学习、数据挖掘等方面发挥着重要作

    2024年02月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包