当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质

矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵

例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就表示一学年科目成绩的总和


矩阵的数量乘法:一个数乘于一个矩阵

还是接着上面学生成绩的例子:

矩阵数量乘法可以理解为,求两学期学生科目成绩的平均分1/2(A+B),因为之前我们已经算出了一学年科目的成绩总和,现在只需要乘于二分之一就可以了。

矩阵的数量乘法还有一个几何的直观理解:

下图的矩阵P可以理解为3个行向量组成,这3个行向量表示的是二维平面坐标系中的一个点,就是表示一个三角形,矩阵的数量乘法2.P之后,这个三角形就缩放变大了

矩阵的基本运算性质

简单证明:k ⋅(A + B) = k ⋅ A + k ⋅ B(这都还用证????不过出于数学逻辑思维的严谨,还是需要证明的)

两个矩阵:


实现矩阵的基本运算

之前定义的向量类Vector:

import math
from ._globals import EPSILONclass Vector:def __init__(self, lst):self._values = list(lst)@classmethoddef zero(cls, dim):"""返回一个dim维的零向量"""return cls([0] * dim)def __add__(self, another):"""向量加法,返回结果向量"""assert len(self) == len(another), "Error in adding. Length of vectors must be same."return Vector([a + b for a, b in zip(self, another)])def __sub__(self, another):"""向量减法,返回结果向量"""assert len(self) == len(another), "Error in subtracting. Length of vectors must be same."return Vector([a - b for a, b in zip(self, another)])def norm(self):"""返回向量的模"""return math.sqrt(sum(e**2 for e in self))def normalize(self):"""返回向量的单位向量"""if self.norm() < EPSILON:raise ZeroDivisionError("Normalize error! norm is zero.")return Vector(self._values) / self.norm()def dot(self, another):"""向量点乘,返回结果标量"""assert len(self) == len(another), "Error in dot product. Length of vectors must be same."return sum(a * b for a, b in zip(self, another))def __mul__(self, k):"""返回数量乘法的结果向量:self * k"""return Vector([k * e for e in self])def __rmul__(self, k):"""返回数量乘法的结果向量:k * self"""return self * kdef __truediv__(self, k):"""返回数量除法的结果向量:self / k"""return (1 / k) * selfdef __pos__(self):"""返回向量取正的结果向量"""return 1 * selfdef __neg__(self):"""返回向量取负的结果向量"""return -1 * selfdef __iter__(self):"""返回向量的迭代器"""return self._values.__iter__()def __getitem__(self, index):"""取向量的第index个元素"""return self._values[index]def __len__(self):"""返回向量长度(有多少个元素)"""return len(self._values)def __repr__(self):return "Vector({})".format(self._values)def __str__(self):return "({})".format(", ".join(str(e) for e in self._values))

定义一个内部使用的文件_globals,用来存储全局使用的变量 EPSILON,用来判断精度用的

EPSILON = 1e-8

定义的矩阵类Matrix:

from .Vector import Vectorclass Matrix:def __init__(self, list2d):self._values = [row[:] for row in list2d]@classmethoddef zero(cls, r, c):"""返回一个r行c列的零矩阵"""return cls([[0] * c for _ in range(r)])def __add__(self, another):"""返回两个矩阵的加法结果"""assert self.shape() == another.shape(), "Error in adding. Shape of matrix must be same."return Matrix([[a + b for a, b in zip(self.row_vector(i), another.row_vector(i))]for i in range(self.row_num())])def __sub__(self, another):"""返回两个矩阵的减法结果"""assert self.shape() == another.shape(), "Error in subtracting. Shape of matrix must be same."return Matrix([[a - b for a, b in zip(self.row_vector(i), another.row_vector(i))]for i in range(self.row_num())])def __mul__(self, k):"""返回矩阵的数量乘结果: 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 * kdef __truediv__(self, k):"""返回数量除法的结果矩阵:self / k"""return (1 / k) * selfdef __pos__(self):"""返回矩阵取正的结果"""return 1 * selfdef __neg__(self):"""返回矩阵取负的结果"""return -1 * selfdef 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 = posreturn self._values[r][c]def size(self):"""返回矩阵的元素个数"""r, c = self.shape()return r * cdef row_num(self):"""返回矩阵的行数"""return self.shape()[0]__len__ = row_numdef col_num(self):"""返回矩阵的列数"""return self.shape()[1]def shape(self):"""返回矩阵的形状: (行数, 列数)"""return len(self._values), len(self._values[0])def __repr__(self):return "Matrix({})".format(self._values)__str__ = __repr__

测试代码:

from playLA.Matrix import Matrixif __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(matrix2)print("add: {}".format(matrix + matrix2))print("subtract: {}".format(matrix - matrix2))print("scalar-mul: {}".format(2 * matrix))print("scalar-mul: {}".format(matrix * 2))print("zero_2_3: {}".format(Matrix.zero(2, 3)))

c++ 二维矩阵 转vector_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...相关推荐

  1. python 矩阵除法_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  2. c++矩阵类_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  3. 三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算

    本笔记系列以斯坦福大学CS231N课程为大纲,海豚浏览器每周组织一次授课和习题答疑.具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群(142961883)发布.同时课程通过腾讯课堂 ...

  4. 计算机二维动画学什么,An学习笔记:计算机二维动画

    1.动画 动画即采用逐帧拍摄对象并连续播放而形成运动的影像技术. 2.帧及关键帧 帧--就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一个镜头. 关键帧--任何动画要表现运动或变化,至少前 ...

  5. 线性代数学习笔记——第四章学习指南——n维向量空间

    一.学习内容及要求 1. 内容: §4.1. n维向量空间的概念 线性代数学习笔记--第四十讲--n维向量空间的概念 线性代数学习笔记--第四十一讲--n维向量空间的子空间 §4.2. 向量组的线性相 ...

  6. 线性代数学习笔记(十五)——初等变换(一)

    本篇笔记首先讨论了矩阵的初等变换,包括初等行变换和初等列变换两类,每一类初等变换又有三种变换规则,需要注意该初等变换与行列式对应的性质没有任何关系:然后讨论了初等变换和标准形的关系,任意矩阵都可以通过 ...

  7. 线性代数学习笔记2-2:向量空间、子空间、最大无关组、基、秩与空间维数

    向量空间 向量空间就是一些向量的集合,并且满足:向量空间对于这些向量的线性组合封闭(任意向量间的加法.数乘,得到的向量仍属于这个向量空间) 具体来说,向量空间中的元素(向量)的加法和数乘满足8条公理 ...

  8. 线性代数学习笔记(二十九)——方程组解的结构(一)

    停更2年多了,做事得有始有终,继续更新... 本篇笔记回顾了线性方程组解的三种情况,并讨论了齐次线性方程组解的结构,并介绍了齐次线性方程组解的相关性质.其中重点讨论了基础解系定义,以及基础解系的求法和 ...

  9. 线性代数学习笔记(二十二)——向量间的线性关系(二)

    本篇笔记首先介绍了线性相关和线性无关的概念,关键是找到一组不全为零相关系数使得等成立:然后重点介绍了一些重要的结论,以及向量组线性相关和线性无关的几个充要条件. 1 线性相关与线性无关 线性相关:设 ...

最新文章

  1. 网站SEO优化的高效手段有哪些?
  2. springCloud学习1(集中式配置管理)
  3. 将图片序列化和反序列化
  4. 2019最佳年会,新东方6名员工冒着离职的风险,在年会上怒怼老板
  5. CAN和CANOpen的关系
  6. python嵌套列表操作方法_python中多层嵌套列表的拆分方法
  7. CSS提高图片清晰度
  8. 一个简易的FTP客户端软件
  9. 网络分层和Http协议原理
  10. 斑马打印机ZPL语言和EPL语言的区别是什么
  11. 带宽、线速、吞吐量概念
  12. python3编程小车_控制小车
  13. 使用python turtle库13行代码实现奥运五环
  14. 小程序实战—答题类小程序
  15. [转载]中国最致命的薄弱环节!(一个机械类毕业生的心声)
  16. Flutter设置Container的最大最小宽高
  17. lisp 河道水面线计算_案例分析:河道水面线应该怎么计算?
  18. 如何彻底卸载最新版的edge?
  19. JAVA RedisTemplate实现(加锁/解锁) 解决高并发问题
  20. python 鼠标连点脚本

热门文章

  1. 基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试
  2. WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题
  3. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
  4. 小心 Enum Parse 中的坑
  5. 【Git】Git-常用命令备忘录(三)
  6. 终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的
  7. 利用obfuscar对.NET应用进行混淆
  8. Orleans 3.0 为我们带来了什么
  9. 友浩达优选上新,原生态农产品,买得安心,吃得放心
  10. Docker系列之镜像瘦身(五)