const Matrix=require('./Matrix.js') //将一个矩阵转换成上三角矩阵 function upperMatrix(oriMatrix) { const matrix=oriMatrix.clone(); const EPS=0.00001; let r=0; //生成上三角矩阵 for(let i=0;i<matrix.Row;i++){ //循环行 for(let j=r;j<matrix.Row;j++){ if(Math.abs(matrix.getItem(j,i))>EPS){ if(j!==r){ //行交换位置 matrix.swapRow(j,r) } break; } } if(Math.abs(matrix.getItem(r,i)<EPS)){ continue; } //方程相减,消除元 for(let j=0;j<matrix.Row;j++){ if(j!==r&&Math.abs(matrix.getItem(j,i))>EPS){ let tmp=matrix.getItem(j,i)/matrix.getItem(r,i); for(let k=i;k<matrix.Column;k++){ const item=matrix.getItem(j,k)-tmp*matrix.getItem(r,k) matrix.setItem(j,k,item) } } } r++; } return matrix } //求矩阵的逆 function Inverse(matrix){ if(matrix.Row!==matrix.Column){ throw '矩阵的行与列需要相等'; } const N=matrix.Row; //方程矩阵A const A = new Matrix([],N,2*N); for(let r=0;r<N;r++){ for(let c=0;c<N;c++){ A.setItem(r,c,matrix.getItem(r,c)) } } for(let r=0;r<N;r++){ for(let c=N;c<N*2;c++){ if(r===c-N){ A.setItem(r,c,1) }else{ A.setItem(r,c,0) } } } //换成上三角矩阵 const B=upperMatrix(A) //左边转成单位矩阵 for(let i=0;i<N;i++){ if(Math.abs(B.getItem(i,i))!==1){ for(let k=N;k<2*N;k++){ B.setItem(i,k,B.getItem(i,k)/B.getItem(i,i)) } B.setItem(i,i,1) } } //输出结果 const C = new Matrix([],N,N); C.rowMap(function (item,r,c) { return B.getItem(r,c+N); }) return C; } //求矩阵的逆 const a=new Matrix([ 1,1,1, 1,2,1, 1,2,3, ],3,3); //b是a矩阵的逆 const b=Inverse(a); console.log(b.toString()); //a*b=单位矩阵 console.log(a.multiply(b).toString());