【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} [13?24?],[57?68?]

則它們的和為:

[ 6 8 10 12 ] \begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix} [610?812?]

代碼實現:

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} ?146?381?252? ?, ?231?167?543? ?

則它們的差為:

[ ? 1 2 ? 3 1 2 1 5 ? 6 ? 1 ] \begin{bmatrix} -1 & 2 & -3 \\ 1 & 2 & 1 \\ 5 & -6 & -1 \end{bmatrix} ??115?22?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} [12?35?]

則它乘以標量 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×[12?35?]=[24?610?]

代碼實現:

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} [14?25?36?], ?7911?81012? ?
以下是兩個 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.pswp.cn/news/41909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41909.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows bat腳本,使用命令行增加/刪除防火墻:入站-出站,規則

常常手動設置防火墻的入站或出站規則&#xff0c;比較麻煩&#xff0c;其實可以用命令行搞定。 下面是禁用BCompare.exe連接網絡的例子&#xff1a; ECHO OFF&(PUSHD "%~DP0")&(REG QUERY "HKU\S-1-5-19">NUL 2>&1)||(powershell -Comm…

web即時通訊系統與APP即時通訊系統有什么區別?

隨著互聯網的不斷發展&#xff0c;即時通訊技術也在不斷地完善和發展&#xff0c;其中Web即時通訊系統和APP即時通訊系統成為了人們廣泛使用的兩種通訊方式。那么&#xff0c;這兩者之間究竟有什么區別呢&#xff1f;在本文中&#xff0c;我們將為您詳細介紹這兩種通訊方式的區…

如何將labelImg打包成exe

最近整理一下數據標注這塊的內容&#xff0c;在目標檢測和目標分割里面用的最多的標注工具labelimg&#xff0c;labelme labelimg主要用于目標檢測領域制作自己的數據集&#xff0c;如&#xff1a;YOLO系列目標檢測模型 labelme主要用于圖像分割領域制作自己的數據集&#xf…

如何仿寫簡易tomcat 實現思路+代碼詳細講解

仿寫之前&#xff0c;我們要搞清楚都要用到哪些技術 自定義注解&#xff0c;比如Tomcat使用的是Servlet&#xff0c;我們可以定義一個自己的MyServlet構造請求體和返回體&#xff0c;比如tomcat使用HttpRequest&#xff0c;我們可以自己定義myHttpRequestjava去遍歷一個指定目…

Structs新增接口 報錯404,找不到資源

起因&#xff1a;最近在一個古老框架structs上開發新功能&#xff0c;由于之前沒接觸過&#xff0c;故此記錄 新增接口&#xff0c; 接口類&#xff1a; Path("/A") Produces({ MediaType.APPLICATION_JSON }) public interface Money {POSTPath("/B")Resu…

數據結構——鏈表詳解

鏈表 文章目錄 鏈表前言認識鏈表單鏈表結構圖帶頭單循環鏈表結構圖雙向循環鏈表結構圖帶頭雙向循環鏈表結構圖 鏈表特點 鏈表實現(帶頭雙向循環鏈表實現)鏈表結構體(1) 新建頭節點(2) 建立新節點(3)尾部插入節點(4)刪除節點(5)頭部插入節點(6) 頭刪節點(7) 尋找節點(8) pos位置…

網絡編程socket.close/output.close/socket.shutdownOutput區別與流程分析

文章目錄 三種方法效果的區別套接字Socket關閉與釋放的區別服務器執行三種關閉操作后&#xff0c;繼續發送/接收數據會發生什么socket.shutdownOutput 關閉連接 找了半個小時沒一個說明白的帖子&#xff0c;真的折磨 三種方法效果的區別 socket.close()Socket主動禁止輸入和輸…

APP外包開發原生和H5的區別

原生開發和H5開發是兩種不同的方法&#xff0c;用于創建移動應用程序。它們具有各自的特點、優勢和劣勢&#xff0c;適用于不同的應用場景。以下是原生開發和H5開發之間的一些主要區別&#xff0c;希望對大家有所幫助。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發…

DELETE 與TRUNCATE區別

DELETE 與TRUNCATE區別 要清空 PostgreSQL 中的表數據&#xff0c;可以使用 DELETE 或 TRUNCATE 語句。下面是兩種方法的示例&#xff1a; 使用 DELETE 語句清空表數據&#xff1a; DELETE FROM 表名;例如&#xff0c;要清空名為 users 的表數據&#xff1a; DELETE FROM u…

未來公文的智能化進程

隨著技術的飛速發展&#xff0c;公文——這個有著悠久歷史的官方溝通方式&#xff0c;也正逐步走向智能化的未來。自動化、人工智能、區塊鏈...這些現代科技正重塑我們的公文制度&#xff0c;讓其變得更加高效、安全和智慧。 1.語義理解與自動生成 通過深度學習和NLP&#xff…

14-案例:購物車

綜合案例-購物車 需求說明: 1. 渲染功能 v-if/v-else v-for :class 2. 刪除功能 點擊傳參 filter過濾覆蓋原數組 3. 修改個數 點擊傳參 find找對象 4. 全選反選 計算屬性computed 完整寫法 get/set 5. 統計 選中的 總價 和 數量 計算屬性conputed reduce條件求和 6. 持久化到本…

電子商務公開密鑰加密法

(一)定義與應用原理 公開密鑰加密法是針對私有密鑰加密法的缺陷而提出來的。是電子商務應 用的核心密碼技術。所謂公開密鑰加密&#xff0c;就是指在計算機網絡上甲、乙兩用戶之間 進行通信時&#xff0c;發送方甲為了保護要傳輸的明文信息不被第三方竊取&#xff0c;采用密…

從零基礎到精通IT:探索高效學習路徑與成功案例

文章目錄 導語&#xff1a;第一步&#xff1a;明確學習目標與方向選擇適合的IT方向設定具體的學習目標咨詢和調研 第二步&#xff1a;系統學習基礎知識選擇適合的編程語言學習數據結構和算法掌握操作系統和計算機網絡基礎 第三步&#xff1a;實踐項目鍛煉技能選擇合適的項目編寫…

聊一下操作系統 macOS 與 Linux

對于Windows操作系統大家都比較熟悉&#xff0c;也常拿它與Linux操作系統進行比較&#xff0c;兩者之間的差異也很明顯。但對于macOS 和 Linux的比較不太多&#xff0c;很多人認為它們很相似&#xff0c;因為這兩種操作系統都可以運行 Unix 命令。其實詳細比較下&#xff0c;兩…

Redis——哨兵模式(docker部署redis哨兵)+緩存穿透和雪崩

哨兵模式 自動選取主機的模式。 概述 主從切換技術的方法是:當主服務器宕機后&#xff0c;需要手動把一臺從服務器切換為主服務器&#xff0c;這就需要人工干預&#xff0c;費事費力&#xff0c;還會造成段時間內服務不可用。這不是一種推薦的方式&#xff0c;更多時候&…

前端開發怎么解決性能優化的問題? - 易智編譯EaseEditing

前端性能優化是確保網站或應用在加載速度、響應性和用戶體驗等方面達到最佳狀態的關鍵任務。以下是一些解決前端性能優化問題的方法&#xff1a; 壓縮和合并代碼&#xff1a; 壓縮和合并CSS、JavaScript和HTML文件可以減少文件大小&#xff0c;加快加載速度。使用壓縮工具&am…

【Linux】Linux下常用查看文件指令小結

0x00 前言 版本信息&#xff1a;Ubuntu 18.04.6 LTS 最后更新日期&#xff1a;2023.8.18 0x01 Linux下常用查看文件指令小結 cat file &#xff1a;顯示文件內容&#xff0c;支持-n選項&#xff0c;即cat -n file&#xff0c;表示加行號顯示文件內容&#xff0c;不過不適合看…

vue vs react

vue 簡介&#xff1a;漸進式 JavaScript 框架 來源&#xff1a;最初由 Evan You &#xff08;尤雨溪&#xff09;于2014年開發。Evan You之前在Google研究過AngularJS&#xff0c;并提取了Angular的部分特性以提供一個更輕量級的框架 版本&#xff1a; vue 1x&#xff1a;2014…

協同過濾推薦算法-基于Django+mysql的智能水果銷售系統設計(可做計算機畢設)

隨著科技的不斷發展&#xff0c;智能化已經成為各行各業的趨勢&#xff0c;水果銷售行業也不例外。智能水果銷售系統就是應運而生的一種智能化解決方案&#xff0c;它可以為用戶提供更加便捷、高效的購物體驗。其中&#xff0c;系統模塊是智能水果銷售系統的重要組成部分。 系…

tsconfig.json

概念 tsconfig.json所在位置是ts項目的根目錄&#xff0c;他的主要作用是自定義配置不同的選項來告訴編譯器如何編譯當前項目。 重要屬性 compilerOptions - 主要用來配置目標js版本&#xff08;target&#xff09;、模塊解析方式&#xff08;moudle&#xff09;、輸出目錄&am…