美文网首页每天学一点新知识
用python实现矩阵和矩阵的相乘_线性代数_day16

用python实现矩阵和矩阵的相乘_线性代数_day16

作者: FANDX | 来源:发表于2020-01-30 19:41 被阅读0次
from playLA.Vector import Vector


class Matrix(object):
    def __init__(self, list2d):
        """初始化矩阵类"""
        self._values = [row[:] for row in list2d]

    @classmethod
    def zero(cls, r, c):
        """返回一个r行,c列的零矩阵"""
        return cls([[0]*c for _ in range(r)])

    def __add__(self, other):
        """返回两个矩阵的加法的结果"""
        assert self.shape() == other.shape(), \
            "这两个矩阵的大小必须是一样的"
        return Matrix([a + b for a, b in zip(self.row_vector(i), other.row_vector(i))]
                      for i in range(self.row_num()))

    def __sub__(self, other):
        """返回两个矩阵的减法的结果"""
        assert self.shape() == other.shape(), \
            "这两个矩阵的大小必须是一样的"
        return Matrix([a - b for a, b in zip(self.row_vector(i), other.row_vector(i))]
                      for i in range(self.row_num()))

    def dot(self, another):
        """返回矩阵和矩阵 或 矩阵和向量的 相乘的结果"""
        if isinstance(another, Vector):
            # 矩阵和向量的相乘
            assert self.col_num()==len(another), \
                "矩阵 和 向量的长度不一致"
            return Vector([self.row_vector(i).dot(another) for i in range(self.row_num())])


        if isinstance(another, Matrix):
            # 矩阵和矩阵的相乘
            assert self.col_num() == another.row_num(), \
                "矩阵和矩阵的维度不相同"
            return Matrix([[self.row_vector(i).dot(another.col_vector(j)) for j in range(another.col_num())
                            for i in range(self.row_num())]])


    def __mul__(self, k):
        """返回矩阵的数量乘法"""
        return Matrix([e * k for e in self.row_vector(i)] for i in range(self.row_num()))

    def __rmul__(self, k):
        """返回矩阵的数量乘法,这次返回的是k * self的值"""
        return self * k

    def __truediv__(self, k):
        """返回矩阵的数量除法: self / k"""
        return (1 / k) * self

    def __pos__(self):
        """返回矩阵取正的结果"""
        return 1 * self

    def __neg__(self):
        """返回矩阵取负的方法"""
        return -1 * self

    def row_vector(self, index):
        """返回矩阵的第index个行向量"""
        return Vector(self._values[index])

    def col_vector(self, index):
        """返回矩阵的第index个列向量"""
        return Vector([row[index] for row in self._values])

    def __getitem__(self, pos):
        """返回矩阵pos位置的元素"""
        r, c = pos
        return self._values[r][c]

    def size(self):
        """返回矩阵中的元素的个数"""
        r, c = self.shape()
        return r * c

    def shape(self):
        """返回矩阵的形状:(行数, 列数)"""
        return len(self._values), len(self._values[0])

    def row_num(self):
        """返回矩阵的行数"""
        return self.shape()[0]

    __len__ = row_num

    def col_num(self):
        """返回矩阵的列数"""
        return self.shape()[1]

    def __repr__(self):
        return "Matrix({})".format(self._values)

    __str__ = __repr__


if __name__ == '__main__':
    matrix = Matrix([[1, 2], [3, 4]])
    print(matrix)

    print("matrix.shape = {}".format(matrix.shape()))
    print("matrix.size = {}".format(matrix.size()))
    print("len(matrix) = {}".format(len(matrix)))
    print("matrix[0][0] = {}".format(matrix[0, 0]))

    # -------------- 实现矩阵的基本运算-----------------
    matrix2 = Matrix([[5, 6], [7, 8]])
    print("add: {}".format(matrix + matrix2))
    print("subtract: {}".format(matrix - matrix2))
    print("scalar-mul: {}".format(matrix * 2))
    print("scalar-mul: {}".format(2 * matrix ))
    print("zero 2 3: {}".format(Matrix.zero(2, 3)))

    # 矩阵和矩阵之间的点乘
    T = Matrix([[1.5, 0],[0, 2]])
    p = Vector([5, 3])
    print("T.dot(p) = {}".format(T.dot(p)))

    p = Matrix([[0, 4, 5], [0, 0, 3]])
    print("T.dot(P) = {}".format(T.dot(p)))

    print("A.dot(B) = {}".format(matrix.dot(matrix2)))
    print("B.dot(A) = {}".format(matrix2.dot(matrix)))

相关文章

  • numpy -- 实现线性代数

    Python 实现线性代数 m_n 与 n_k 这样的矩阵才能相乘 矩阵求逆 矩阵和矩阵的逆相乘结果为单位矩阵 qr分解

  • 用python实现矩阵和矩阵的相乘_线性代数_day16

  • 矩阵乘法为什么定义为行乘以列?

    矩阵相乘还是矩阵,对应矩阵位置相乘是标量值! 矩阵,大家上过《线性代数》的同学都知道是一堆的大括号,一堆的数据。为...

  • Css高阶用法(一) matrix

    矩阵(matrix) 线性代数基础课里就有对矩阵的阐述,大致形式如下 矩阵乘法 "点积" 是把 对称的元素相乘,然...

  • 矩阵和矩阵的相乘_线性代数_day15

    矩阵在图像变换中的应用 矩阵乘法的定义 矩阵和矩阵的相乘,就是分成每一个矩阵和向量的相乘 矩阵A的列数必须和矩阵B...

  • 矩阵

    1. 线性方程组 2. 矩阵定义 3. 矩阵运算 矩阵的加法矩阵的加法 数与矩阵相乘数与矩阵相乘 矩阵与矩阵相乘矩...

  • Hadoop Page Rank

    Page Rank实现本质也是矩阵相乘 Idea: 用Transition Matrix 乘 initial po...

  • 矩阵运算

    矩阵与标量的乘法 每个元素与标量相乘 矩阵相乘 只有第一个矩阵的列数与第二个矩阵的行数相同,才可以相乘。新矩阵行数...

  • 矩阵链乘法

    矩阵A和矩阵B能够相乘,只有当矩阵A和矩阵B相容。 矩阵链乘法的前提就是降低矩阵的乘法规模。之所以可以这样,是因为...

  • 矩阵论-矩阵乘法的意义

    推荐书籍: 《神奇矩阵》 AB矩阵相乘的表示形式我喜欢这种。 当然有了矩阵相乘也有其反向操作,矩阵的分解。

网友评论

    本文标题:用python实现矩阵和矩阵的相乘_线性代数_day16

    本文链接:https://www.haomeiwen.com/subject/mkcwthtx.html