js 实现矩阵
矩阵的定义与创建
在JavaScript中,矩阵通常以二维数组的形式表示。每个子数组代表矩阵的一行,子数组中的元素代表该行的列值。
// 创建一个2x3的矩阵
const matrix = [
[1, 2, 3],
[4, 5, 6]
];
矩阵的基本操作
矩阵加法 两个相同维度的矩阵可以通过逐元素相加实现加法。
function addMatrices(a, b) {
return a.map((row, i) => row.map((val, j) => val + b[i][j]));
}
矩阵乘法 矩阵乘法遵循线性代数规则,第一个矩阵的列数必须等于第二个矩阵的行数。
function multiplyMatrices(a, b) {
const result = [];
for (let i = 0; i < a.length; i++) {
result[i] = [];
for (let j = 0; j < b[0].length; j++) {
let sum = 0;
for (let k = 0; k < a[0].length; k++) {
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
return result;
}
矩阵转置
转置操作将矩阵的行列互换。

function transpose(matrix) {
return matrix[0].map((_, i) => matrix.map(row => row[i]));
}
矩阵行列式计算
行列式是方阵的一个标量值,用于判断矩阵是否可逆。
function determinant(matrix) {
if (matrix.length === 1) return matrix[0][0];
if (matrix.length === 2) {
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}
let det = 0;
for (let i = 0; i < matrix[0].length; i++) {
const minor = matrix.slice(1).map(row => row.filter((_, j) => j !== i));
det += matrix[0][i] * Math.pow(-1, i) * determinant(minor);
}
return det;
}
矩阵求逆
可逆矩阵的逆矩阵满足与原矩阵相乘为单位矩阵的条件。

function inverse(matrix) {
const det = determinant(matrix);
if (det === 0) throw new Error('Matrix is not invertible');
const adjugate = [];
for (let i = 0; i < matrix.length; i++) {
adjugate[i] = [];
for (let j = 0; j < matrix.length; j++) {
const minor = matrix.filter((_, k) => k !== i)
.map(row => row.filter((_, l) => l !== j));
adjugate[i][j] = Math.pow(-1, i + j) * determinant(minor);
}
}
const adjugateT = transpose(adjugate);
return adjugateT.map(row => row.map(val => val / det));
}
使用库简化操作
对于复杂的矩阵运算,可以使用专门的数学库如math.js或numeric.js。
// 使用math.js示例
const math = require('mathjs');
const m = math.matrix([[1, 2], [3, 4]]);
console.log(math.inv(m)); // 输出逆矩阵
性能优化建议
大型矩阵运算可能消耗大量内存和计算资源。使用TypedArray(如Float64Array)替代普通数组可以提升性能。
// 使用TypedArray创建矩阵
const rows = 1000, cols = 1000;
const matrix = new Float64Array(rows * cols);
// 访问第i行第j列:matrix[i * cols + j]
可视化输出
将矩阵格式化输出为可读字符串。
function matrixToString(matrix) {
return matrix.map(row => row.join('\t')).join('\n');
}
console.log(matrixToString([[1, 2], [3, 4]]));






