zoukankan      html  css  js  c++  java
  • 求矩阵的逆

    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());
  • 相关阅读:
    设计【SPFA】【差分约束】
    黑魔法师之门【并查集】
    太鼓达人【欧拉回路】【DFS】
    七夕祭【模拟】
    圣章精灵使的魔法语【线段树】
    终章剑之魂【模拟】【贪心】
    轻轨【线段树】【贪心】
    气象牛【DP】
    HTML属性
    HTML元素
  • 原文地址:https://www.cnblogs.com/caoke/p/10508269.html
Copyright © 2011-2022 走看看