UNPKG

ml-matrix

Version:

Matrix manipulation and computation library

28 lines (23 loc) 783 B
import SVD from './dc/svd'; import Matrix from './matrix'; export function pseudoInverse(matrix, threshold = Number.EPSILON) { matrix = Matrix.checkMatrix(matrix); if (matrix.isEmpty()) { // with a zero dimension, the pseudo-inverse is the transpose, since all 0xn and nx0 matrices are singular // (0xn)*(nx0)*(0xn) = 0xn // (nx0)*(0xn)*(nx0) = nx0 return matrix.transpose(); } let svdSolution = new SVD(matrix, { autoTranspose: true }); let U = svdSolution.leftSingularVectors; let V = svdSolution.rightSingularVectors; let s = svdSolution.diagonal; for (let i = 0; i < s.length; i++) { if (Math.abs(s[i]) > threshold) { s[i] = 1.0 / s[i]; } else { s[i] = 0.0; } } return V.mmul(Matrix.diag(s).mmul(U.transpose())); }