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

线性代数算法

  • 一、向量的加减乘除
    • 1. 向量加法
    • 2. 向量减法
    • 3. 向量数乘
    • 4. 向量点积
    • 5. 向量叉积
  • 二、矩阵的加减乘除
    • 1. 矩阵加法
    • 2. 矩阵减法
    • 3. 矩阵数乘
    • 4. 矩阵乘法
  • 常用数学库

线性代数是数学的一个分支,用于研究线性方程组及其解的性质、向量空间及其变换的性质等。在计算机科学领域中,线性代数常用于图形学、机器学习、计算机视觉等领域。本文将详细介绍 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]]

以上是一些常见的线性代数算法的示例代码。使用数学库可以方便地实现复杂的线性代数计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/73981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux命名管道进程通信

文章目录 前言一、什么是命名管道通信二、创建方式三、代码示例四、文件进程通信总结 前言 命名管道 是实现进程间通信的强大工具&#xff0c;它提供了一种简单而有效的方式&#xff0c;允许不同进程之间进行可靠的数据交换。不仅可以在同一主机上的不相关进程间进行通信&…

2023年国赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

【JavaScript】match用法 | 正则匹配

match正则匹配 var e "www.apple.com:baidu.com" var match e.match(/com/g) console.log("match: "match);> "match: com,com"match返回值问题 match的返回值是一个数组 数组的第0个元素是与整个正则表达式匹配的结果 数组的第1个元素是…

【新品发布】ChatWork企业知识库系统源码

系统简介 基于前后端分离架构以及Vue3、uni-app、ThinkPHP6.x、PostgreSQL、pgvector技术栈开发&#xff0c;包含PC端、H5端。 ChatWork支持问答式和文档式知识库&#xff0c;能够导入txt、doc、docx、pdf、md等多种格式文档。 导入数据完成向量化训练后&#xff0c;用户提问…

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo

1、什么是 IDEA IDEA 全称 IntelliJ IDEA&#xff0c;是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…

[NDK]从Opengles到Vulkan-基础篇(2)-运行配置

上一篇我们介绍了Opengl和Vulkan运行环境的不同。 引入Opengles,我们需要做的是,在Cmakes中配置动态库引入。 使用opengles2就用GLESv2,用es3就用GLESv3,而EGL需要使用配置EGL环境 这里两个比较基础的东西是EGL和GLES的库引入。 es2只要Android 4.0就开始支持,es3是4.4开…

opencv图片灰度二值化

INCLUDEPATH D:\work\opencv_3.4.2_Qt\include LIBS D:\work\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll #include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视…

共识算法初探

共识机制的背景 加密货币都是去中心化的&#xff0c;去中心化的基础就是P2P节点众多&#xff0c;那么如何吸引用户加入网络成为节点&#xff0c;有那些激励机制&#xff1f;同时&#xff0c;开发的重点是让多个节点维护一个数据库&#xff0c;那么如何决定哪个节点写入&#x…

通过版本号控制强制刷新浏览器或清空浏览器缓存

背景介绍 在我们做 web 项目时&#xff0c;经常会遇到一个问题就是&#xff0c;需要 通知业务人员&#xff08;系统用户&#xff09;刷新浏览器或者清空浏览器 cookie 缓存的情况。 而对于用户而言&#xff0c;很多人一方面不懂如何操作&#xff0c;另一方面由于执行力问题&am…

【C语言】const修饰普通变量和指针

大家好&#xff0c;我是苏貝&#xff0c;本篇博客是系列博客每日一题的第一篇&#xff0c;本系列的题都不会太难&#xff0c;如果大家对这种系列的博客感兴趣的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 文章目录 一.const修饰普通变量二.const修饰指…

Docker容器与虚拟化技术:Docker架构、镜像管理

目录 一、理论 1.Doker概述 2.Docker核心概念 3.Docker安装 4.Docker的镜像管理命令 二、实验 1.Docker安装 2.查看Docker信息 3.Docker的镜像管理命令 三、问题 1.如何注册Docker账号 2.如何设置Docker公共存储库 四、总结 一、理论 1.Doker概述 (1) IT架构 裸…

助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金

近日&#xff0c;在日本千叶县举办的2023年第64届国际数学奥林匹克&#xff08;IMO&#xff09;竞赛公布比赛结果&#xff0c;中国队连续5年获得团体第一。奖牌榜显示&#xff0c;代表中国参赛的6名队员全部获得金牌。其中&#xff0c;猿辅导学员王淳稷、孙启傲分别以42分、39分…

LLaMA长度外推高性价比trick:线性插值法及相关改进源码阅读及相关记录

前言 最近&#xff0c;开源了可商用的llama2&#xff0c;支持长度相比llama1的1024&#xff0c;拓展到了4096长度&#xff0c;然而&#xff0c;相比GPT-4、Claude-2等支持的长度&#xff0c;llama的长度外推显得尤为重要&#xff0c;本文记录了三种网络开源的RoPE改进方式及相…

ArcGIS Pro 基础安装与配置介绍

ArcGIS Pro ArcGIS Pro作为ESRI面向新时代的GIS产品&#xff0c;它在原有的ArcGIS平台上继承了传统桌面软件&#xff08;ArcMap&#xff09;的强大的数据管理、制图、空间分析等能力&#xff0c;还具有其独有的特色功能&#xff0c;例如二三维融合、大数据、矢量切片制作及发布…

用vim打开后中文乱码怎么办

Vim中打开文件乱码主要是文件编码问题。用户可以参考如下解决方法。 1、用vim打开.vimrc配置文件 vim ~/.vimrc**注意&#xff1a;**如果用户根目录下没有.vimrc文件就把/etc/vim/vimrc文件复制过来直接用 cp /etc/vim/vimrc ~/.vimrc2、在.vimrc中加入如下内容 set termen…

树莓派3B CSI摄像头配置

1.硬件连接 1、找到 CSI 接口(树莓派3B的CSI接口在HDMI接口和音频口中间)&#xff0c;需要拉起 CSI 接口挡板,如下&#xff1a; 2、将摄像头排线插入CSI接口。记住&#xff0c;有蓝色胶带的一面应该面向音频口或者网卡方向&#xff0c; 确认方向并插紧排线&#xff0c;将挡板…

app专项测试:app弱网测试

目录 弱网测试背景 网络测试要点 弱网测试关注指标 弱网测试工具 fiddler模拟网络延时场景 网络设置参考 Network Emulator Toolkit模拟网络丢包场景&#xff08;windows网络&#xff09; APP弱网测试 弱网使用工具&#xff1a; app弱网测试要点 APP网络测试要点 网络…

Mysql 搭建MHA高可用架构,实现自动failover,完成主从切换

目录 自动failover MHA&#xff1a; MHA 服务 项目&#xff1a;搭建Mysql主从复制、MHA高可用架构 实验项目IP地址配置&#xff1a; MHA下载地址 项目步骤&#xff1a; 一、修改主机名 二、编写一键安装mha node脚本和一键安装mha mangaer脚本&#xff0c;并执行安装…

网络安全 Day31-运维安全项目-容器架构下

容器架构下 6. Dockerfile6.1 Docker自动化DIY镜像之Dockerfile1) 环境准备2) 书写Dockerfile内容3&#xff09; 运行Dockerfile生成镜像4) 运行容器5) 小结 6.2 案例14&#xff1a;Dockerfile-RUN指令1) 书写Dockerfile2) 构建镜像3) 启动容器4) 测试结果 6.3 Dockerfile指令 …

小程序制作教程:从零开始搭建企业小程序

在如今的数字化时代&#xff0c;企业介绍小程序成为了企业展示与推广的重要工具。通过企业介绍小程序&#xff0c;企业可以向用户展示自己的品牌形象、产品服务以及企业文化等内容&#xff0c;进而提高用户对企业的认知度和信任度。本文将介绍如何从零开始搭建一个企业介绍小程…