【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= −32−3
代码实现:
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= 133−11
代码实现:
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} −11522−6−31−1
代码实现:
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]
]
上述代码中,我们首先定义了两个矩阵 matrixA 和 matrixB,然后定义了一个结果矩阵 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]]
以上是一些常见的线性代数算法的示例代码。使用数学库可以方便地实现复杂的线性代数计算。
相关文章:
【JS 线性代数算法之向量与矩阵】
线性代数算法 一、向量的加减乘除1. 向量加法2. 向量减法3. 向量数乘4. 向量点积5. 向量叉积 二、矩阵的加减乘除1. 矩阵加法2. 矩阵减法3. 矩阵数乘4. 矩阵乘法 常用数学库 线性代数是数学的一个分支,用于研究线性方程组及其解的性质、向量空间及其变换的性质等。在…...
配置 yum/dnf 置您的系统以使用默认存储库
题目 给系统配置默认存储库,要求如下: YUM 的 两 个 存 储 库 的 地 址 分 别 是 : ftp://host.domain8.rhce.cc/dvd/BaseOS ftp://host.domain8.rhce.cc/dvd/AppStream vim /etc/yum.repos.d/redhat.repo [base] namebase baseurlftp:/…...
Docker容器与虚拟化技术:Docker资源控制、数据管理
目录 一、理论 1.资源控制 2.Docker数据管理 二、实验 1.Docker资源控制 2.Docker数据管理 三、问题 1.docker容器故障导致大量日志集满,造成磁盘空间满 2、当日志占满之后如何处理 四、总结 一、理论 1.资源控制 (1) CPU 资源控制 cgroups࿰…...
python生成器有几种写法,python生成器函数例子
大家好,小编来为大家解答以下问题,python生成器有几种写法,python生成器函数例子,今天让我们一起来看看吧! 本文部分参考:Python迭代器,生成器–精华中的精华 https://www.cnblogs.com/deeper/p…...
动态动画弹窗样式css
点击下载图片素材 html <div class"popWin"> </div> <div class"popPic"><div class"popWinBtn01">查看证书</div><div class"wintips01">恭喜您已完成训练营学习任务,荣誉证书已发放…...
数据生成 | MATLAB实现WGAN生成对抗网络数据生成
数据生成 | MATLAB实现WGAN生成对抗网络数据生成 目录 数据生成 | MATLAB实现WGAN生成对抗网络数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 1.WGAN生成对抗网络,数据生成,样本生成程序,MATLAB程序; 2.适用于MATL…...
PHP实现每日蛋白质摄入量计算器
1.laravel 路由 //每日蛋白质摄入计算器Route::get(api/protein/intake, FormulaControllerproteinIntakeCal); 2.代码 /*** 每日蛋白质摄入计算器*/public function proteinIntakeCal(){$number intval($this->request(number));$goalFactor array(0.8, 1.16, 0.8, 1.16,…...
vue elment 表格内表单校验代码
<p v-if"scope.row.id">{{ scope.row.bidderCode }}</p><el-form-itemclass"formitem"v-else:prop"bidderCode scope.row.id":rules"getValidationRules(投标人/供应商代码, scope.row.id)"><el-input v-model&…...
如何在Stream流中分组统计
上面是今天碰到需求,之前就做过类似的分组统计,这个相对来说比较简单,统计的也少,序号和总预约人数这两部分交给前端了,不需要由后端统计,后端统计一下预约日期和检查项目和预约人数就行; Overridepublic List<ItemStatisticsVo> statistics(ItemStatisticsModel itemSta…...
windows程序基础
一、windows程序基础 1. Windows程序的特点 1)用户界面统一、友好 2)支持多任务:允许用户同时运行多个应用程序(窗口) 3)独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#…...
【LeetCode】买卖股票的最佳时机最多两次购买机会
买卖股票的最佳时机 题目描述算法分析程序代码 链接: 买卖股票的最佳时机 题目描述 算法分析 程序代码 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector<vector<int>> f(n,vector<int>(3,-0x3f3f3f))…...
【C++ 记忆站】命名空间
文章目录 命名空间概念命名空间的定义1、正常的命名空间定义2、命名空间可以嵌套3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中 命名空间的使用1、加命名空间名称及作用域限定符2、使用using将命名空间中某个成员引入3、使用using namespac…...
《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的例9说明
《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的定理3的引申 定理3 带有i个内点的m叉树含有nmi1个顶点 见本人博文 内点定义不同的讨论 如果对于一个m叉正则树,即任意分支节点的儿子恰好有m个&am…...
【云原生】K8S存储卷:PV、PVC详解
目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,ku…...
谈谈IP地址和子网掩码的概念及应用
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、IP地址的概念 二、IP地址的分类 1、A类 …...
vue2 如何监听数组的变化
在Vue 2中,底层是通过重写数组的原型方法来实现对数组变化的监听。具体来说,Vue 2使用了一个名为Observer的类来劫持数组的原型方法,使其在调用这些方法时能够触发相应的变化通知。 当Vue 2初始化一个响应式对象时,如果对象是一个…...
CSS中的transform属性有哪些值?并分别描述它们的作用。
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ translate()⭐ rotate()⭐ scale()⭐ skew()⭐ matrix()⭐ scaleX() 和 scaleY()⭐ rotateX()、rotateY() 和 rotateZ()⭐ translateX() 和 translateY()⭐ skewX() 和 skewY()⭐ perspective()⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…...
vue3跳转页面后 海康监控实例不销毁
第一个页面是这样的 跳转到新的页面 只有海康的监控没有消失 使用控制台审查元素也审查不到 解决方法:在vue3的销毁周期把海康的监控销毁掉 import { reactive, onDeactivated} from "vue"; const state reactive({oWebControl: null as any, //监控绑…...
Unity 射线检测
文章目录 1. 定义2. 重要类和方法2.1 Ray2.2 从屏幕发出射线:2.3 Raycast2.4 RaycastAll2.5 RaycastHit 碰撞信息2.6 layerMask 让射线检测只检测指定层级的对象 1. 定义 在Unity中,射线检测(Raycasting)是一种常用的技术&#x…...
微信支付报非法的密钥大小: Caused by: java.security.InvalidKeyException: Illegal key size
在Linux环境中出现 java.security.InvalidKeyException: Illegal key size 异常通常是由于Java默认的加密限制引起的。Java默认的加密强度限制了加密算法密钥的最大长度 方式一 1. 找到该目录 /usr/java/jdk1.8.0_121/jre/lib/security 2. 替换local_policy.jar 和 US_export_…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
