線性代數算法
- 一、向量的加減乘除
- 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]
]
上述代碼中,我們首先定義了兩個矩陣 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]]
以上是一些常見的線性代數算法的示例代碼。使用數學庫可以方便地實現復雜的線性代數計算。