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());