export function matrixInverse(matrix: number[][]): number[][] { const n = matrix.length; const identityMatrix = Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)) ); const augmentedMatrix = matrix.map((row, i) => [ ...row, ...identityMatrix[i] ]); for (let i = 0; i < n; i++) { let maxEl = Math.abs(augmentedMatrix[i][i]); let maxRow = i; for (let k = i + 1; k < n; k++) { if (Math.abs(augmentedMatrix[k][i]) > maxEl) { maxEl = Math.abs(augmentedMatrix[k][i]); maxRow = k; } } const temp = augmentedMatrix[maxRow]; augmentedMatrix[maxRow] = augmentedMatrix[i]; augmentedMatrix[i] = temp; for (let k = i + 1; k < n; k++) { const c = -augmentedMatrix[k][i] / augmentedMatrix[i][i]; for (let j = i; j < 2 * n; j++) { if (i === j) { augmentedMatrix[k][j] = 0; } else { augmentedMatrix[k][j] += c * augmentedMatrix[i][j]; } } } } for (let i = n - 1; i >= 0; i--) { for (let k = n; k < 2 * n; k++) { augmentedMatrix[i][k] /= augmentedMatrix[i][i]; } augmentedMatrix[i][i] = 1; for (let rowModify = i - 1; rowModify >= 0; rowModify--) { const c = -augmentedMatrix[rowModify][i]; for (let k = i; k < 2 * n; k++) { if (i === k) { augmentedMatrix[rowModify][k] = 0; } else { augmentedMatrix[rowModify][k] += c * augmentedMatrix[i][k]; } } } } const inverseMatrix = augmentedMatrix.map((row) => row.slice(n)); return inverseMatrix; }