矩阵

矩阵

矩阵乘法

AB != BA  不满足交换律(matrix(1x3) * matrix(3x1) = matrix(1x1)) !== matrix(3x1) * (matrix(1x3)) = matrix(3x3)

(AB)C = A(BC) 结合律

K(AB) = (kA)B 分配律

(AB)^T = B^TA^T

(M1M2Mn)^T = Mn^T...M1^T


vABC 行向量左乘
CBAv 列向量右乘
class Matrix {
    constructor(...components) {
        this.rows = components
    }
    columns() {
        // (M * N)^T = matirx(N * M)
        // const colLen = this.rows[0].length
        // const rowLen = this.rows.length
        // const newRows = []
        // for (let colIndex = 0; colIndex < colLen; colIndex++) {
        //     const rows = []
        //     for (let rowIndex = 0; rowIndex < rowLen; rowIndex++) {
        //         rows[rowIndex] = this.rows[rowIndex][colIndex]
        //     }
        //     newRows[colIndex] = rows
        // }
        // return newRows
        return this.rows[0].map((_, i) => this.rows.map(row => row[i]))
    }
    mult(other) {
        if (this.rows[0].length !== other.rows.length) {
            throw new Error('该矩阵的列数不等于给定矩阵的行数')
        }
        const sum  = arr => arr.reduce((el, next) => el + next, 0)
        // 将矩阵转置
        const columns = other.columns()
        const newRows = this.rows.map(row => (
            columns.map(column => (
                sum(row.map((element, i) => element * column[i]))
            ))
        ))

        return new Matrix(...newRows)
    }
    transpose(){
        return new Matrix(...this.columns())
    }
    scaleMult(number){
        const newRows = this.rows.map(row => (
            row.map(element => element * number)
        ))
        return new Matrix(...newRows)
    }
}

const log = console.log

const one = new Matrix(
    [3, -1, 4],
  )
  const other = new Matrix(
    [-2, 0, 3],
    [5,  7, -6],
    [1,  -4, 2]
  )
log(one.transpose())

// const one = new Matrix(
//     [1, -5, 3],
//     // [0, -2, 6],
//     // [7, 2, -4],
//   )
//   const other = new Matrix(
//     [-8, 6, 1],
//     [7,  0, -3],
//     [2,  4, 5]
//   )

//   log(one.mult(other))
//   log(one.scaleMult(2))
//   log(one.transpose())

// const one = new Matrix(
//   [3, -4],
//   [0, -3],
//   [6, -2],
//   [-1, 1]
// )
// const other = new Matrix(
//   [3,  2, -4],
//   [4, -3,  5]
// )
// log(one.mult(other))
posted @ 2020-10-14 21:54  pluscat  阅读(115)  评论(0编辑  收藏  举报