Matrix.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import IllegalArgumentException from '../../../../java/lang/IllegalArgumentException'
  2. export default class Matrix {
  3. static solve(a, b) {
  4. const n = b.length
  5. if (a.length !== n || a[0].length !== n) throw new IllegalArgumentException('Matrix A is incorrectly sized')
  6. for (let i = 0; i < n; i++) {
  7. let maxElementRow = i
  8. for (let j = i + 1; j < n; j++) if (Math.abs(a[j][i]) > Math.abs(a[maxElementRow][i])) maxElementRow = j
  9. if (a[maxElementRow][i] === 0.0) return null
  10. Matrix.swapRows(a, i, maxElementRow)
  11. Matrix.swapRows(b, i, maxElementRow)
  12. for (let j = i + 1; j < n; j++) {
  13. const rowFactor = a[j][i] / a[i][i]
  14. for (let k = n - 1; k >= i; k--) a[j][k] -= a[i][k] * rowFactor
  15. b[j] -= b[i] * rowFactor
  16. }
  17. }
  18. const solution = new Array(n).fill(null)
  19. for (let j = n - 1; j >= 0; j--) {
  20. let t = 0.0
  21. for (let k = j + 1; k < n; k++) t += a[j][k] * solution[k]
  22. solution[j] = (b[j] - t) / a[j][j]
  23. }
  24. return solution
  25. }
  26. static swapRows() {
  27. if (Number.isInteger(arguments[2]) && (arguments[0] instanceof Array && Number.isInteger(arguments[1]))) {
  28. const m = arguments[0], i = arguments[1], j = arguments[2]
  29. if (i === j) return null
  30. for (let col = 0; col < m[0].length; col++) {
  31. const temp = m[i][col]
  32. m[i][col] = m[j][col]
  33. m[j][col] = temp
  34. }
  35. } else if (Number.isInteger(arguments[2]) && (arguments[0] instanceof Array && Number.isInteger(arguments[1]))) {
  36. const m = arguments[0], i = arguments[1], j = arguments[2]
  37. if (i === j) return null
  38. const temp = m[i]
  39. m[i] = m[j]
  40. m[j] = temp
  41. }
  42. }
  43. }