js之矩阵运算方法

js之矩阵运算方法

 

一、方法

 

// 转置矩阵
    function transpose(matrix) {
let result = new Array(matrix[0].length).fill(0).map(arr => new Array(matrix.length).fill(0));
for (let i = 0; i < result.length; i++) { for (let j = 0; j < result[0].length; j++) { result[i][j] = matrix[j][i]; } } return result; } // 行列式 function det(square) { // 方阵约束 if (square.length !== square[0].length) { throw new Error(); } // 方阵阶数 let n = square.length; let result = 0; if (n > 3) { // n 阶 for (let column = 0; column < n; column++) { // 去掉第 0 行第 column 列的矩阵 let matrix = new Array(n - 1).fill(0).map(arr => new Array(n - 1).fill(0)); for (let i = 0; i < n - 1; i++) { for (let j = 0; j < n - 1; j++) { if (j < column) { matrix[i][j] = square[i + 1][j]; } else { matrix[i][j] = square[i + 1][j + 1]; } } } result += square[0][column] * Math.pow(-1, 0 + column) * det(matrix); } } else if (n === 3) { // 3 阶 result = square[0][0] * square[1][1] * square[2][2] + square[0][1] * square[1][2] * square[2][0] + square[0][2] * square[1][0] * square[2][1] - square[0][2] * square[1][1] * square[2][0] - square[0][1] * square[1][0] * square[2][2] - square[0][0] * square[1][2] * square[2][1]; } else if (n === 2) { // 2 阶 result = square[0][0] * square[1][1] - square[0][1] * square[1][0]; } else if (n === 1) { // 1 阶 result = square[0][0]; } return result; } // 伴随矩阵 function adjoint(square) { // 方阵约束 if (square[0].length !== square.length) { throw new Error(); } let n = square.length; let result = new Array(n).fill(0).map(arr => new Array(n).fill(0)); for (let row = 0; row < n; row++) { for (let column = 0; column < n; column++) { // 去掉第 row 行第 column 列的矩阵 let matrix = []; for (let i = 0; i < square.length; i++) { if (i !== row) { let arr = []; for (let j = 0; j < square.length; j++) { if (j !== column) { arr.push(square[i][j]); } } matrix.push(arr); } } result[row][column] = Math.pow(-1, row + column) * det(matrix); } } return transpose(result); } // 逆矩阵 function inv(square) { if (square[0].length !== square.length) { throw new Error(); } let detValue = det(square); let result = adjoint(square); console.log(JSON.stringify(detValue)) for (let i = 0; i < result.length; i++) { for (let j = 0; j < result.length; j++) { result[i][j] /= detValue; } } return result; } // 矩阵相乘 function multiply(a, b) { // 相乘约束 if (a[0].length !== b.length) { throw new Error(); } let m = a.length; let p = a[0].length; let n = b[0].length; // 初始化 m*n 全 0 二维数组 let c = new Array(m).fill(0).map(arr => new Array(n).fill(0)); for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { for (let k = 0; k < p; k++) { c[i][j] += a[i][k] * b[k][j]; } } } return c; }

 二、使用

 let xy = [-1,-1] // -1,-1
    let xy1 = [-3,-2]
    let xy2 = [-2,-2]

    let lonlat = [2,2]
    let lonlat1 = [0,1]
    let lonlat2 = [1,1]

    let A = [xy1, xy2]
    let B = [lonlat1, lonlat2]

    console.log(JSON.stringify(multiply(A,B)))

    console.log(JSON.stringify(inv(A)))

    
    console.log(JSON.stringify((multiply(B,(inv(A))))))
    console.log(JSON.stringify(multiply(xy,(multiply(B,(inv(A)))))))

 

posted @ 2021-03-03 15:03  莫小龙  阅读(5101)  评论(4编辑  收藏  举报