线性代数-Python-02:矩阵的基本运算 - 手写Matrix及numpy中的用法

文章目录

  • 一、代码仓库
  • 二、矩阵的基本运算
    • 2.1 矩阵的加法
    • 2.2 矩阵的数量乘法
    • 2.3 矩阵和向量的乘法
    • 2.4 矩阵和矩阵的乘法
    • 2.5 矩阵的转置
  • 三、手写Matrix代码
    • Matrix.py
    • main_matrix.py
    • main_numpy_matrix.py

一、代码仓库

https://github.com/Chufeng-Jiang/Python-Linear-Algebra-for-Beginner/tree/main

二、矩阵的基本运算

在这里插入图片描述

2.1 矩阵的加法

在这里插入图片描述

2.2 矩阵的数量乘法

在这里插入图片描述

2.3 矩阵和向量的乘法

在这里插入图片描述

2.4 矩阵和矩阵的乘法

在这里插入图片描述
在这里插入图片描述

2.5 矩阵的转置

在这里插入图片描述

三、手写Matrix代码

Matrix.py

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 T(self):"""返回矩阵的转置矩阵"""return Matrix([[e for e in self.col_vector(i)]for i in range(self.col_num())])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 dot(self, another):"""返回矩阵乘法的结果"""if isinstance(another, Vector):# 矩阵和向量的乘法assert self.col_num() == len(another), \"Error in Matrix-Vector Multiplication."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(), \"Error in Matrix-Matrix Multiplication."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):"""返回矩阵的数量乘结果: 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__

main_matrix.py

from playLA.Vector import Vector
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)))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)))print("P.T = {}".format(P.T()))

在这里插入图片描述

main_numpy_matrix.py

import numpy as npif __name__ == "__main__":# 矩阵的创建A = np.array([[1, 2], [3, 4]])print(A)# 矩阵的属性print(A.shape)print(A.T)# 获取矩阵的元素print(A[1, 1])print(A[0])print(A[:, 0])print(A[1, :])# 矩阵的基本运算B = np.array([[5, 6], [7, 8]])print(A + B)print(A - B)print(10 * A)print(A * 10)print(A * B)print(A.dot(B))p = np.array([10, 100])print(A + p)print(A + 1)print(A.dot(p))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang笔记

01 = 和 := 的区别? 前者是赋值变量,后者是定义变量 02 指针的作用 指针指向变量的地址,在64位机器上占8个字节 【1 字节(Byte)= 8 位(bit) 1 千字节(KB,Kilobyte)= 1,024 字节(2^10 字节)】 作用 取址然后取值swap函数 交换变量的值指针接收器来改变结构体里面…

Python机器学习入门指南

前言 机器学习 作为人工智能领域的核心组成,是计算机程序学习数据经验以优化自身算法,并产生相应的“智能化的”建议与决策的过程。 一个经典的机器学习的定义是: A computer program is said to learn from experience E with respect to …

【Edabit 算法 ★☆☆☆☆☆】 Return Something to Me!

【Edabit 算法 ★☆☆☆☆☆】 Return Something to Me! strings language_fundamentals Instructions Write a function that returns the string "something" joined with a space " " and the given argument a. Examples giveMeSomething(“is bett…

打造属于自己的vue图标库

hfex-icon图标库 Install npm i -D hfex-icon主要提供2种使用方式 方式一 通过svg图标资源,借助unplugin-icons库将svg图标文件生成vue组件,然后通过vue组件的引入方式在vue中使用 unplugin-icons 兼容vue2和vue3 在vue.config.js的plugins中配置…

【C语言】进阶——程序编译

目录 一:🔒程序环境 程序的翻译环境和执行环境 💡1.1翻译环境 预编译阶段: 编译阶段: 汇编阶段: 链接阶段: 💡1.2运行环境 二:🔒预处理详解 &…

文件夹图片相似图片检测并删除相似图片

项目开源地址 pip install imagededupgit clone https://github.com/idealo/imagededup.git cd imagededup pip install "cython>0.29" python setup.py installQuick Start from imagededup.methods import PHash phasher PHash()# Generate encodings for all…

[Spring]为什么Spring动态代理默认使用CGlib,而不是JDK代理?

文章目录 原因一:CGlib不需要接口原因二:CGlib效率高原因三:JDK代理会导致注解失效如果希望使用JDK代理扩展AOP in Spring Boot, is it a JDK dynamic proxy or a Cglib dynamic proxy?SpringSpringBoot 原因一:CGlib不需要接口 …

[AUTOSAR][网络管理] 实战网络管理

文章目录 一、简介(1) 睡眠模式(2) 预睡眠模式(3) 网络模式① 重复报文状态② 常规操作状态③ 准备睡眠状态二、目录介绍三、实现方法(1)can_nm 网络管理硬件层网络管理参数代码实现思路(2)app_nm 网络网络业务层四、测试方法(1) 网络报文唤醒(2) 诊断报文唤醒五、示例…

分类预测 | Matlab实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-BiLSTM鲸鱼算法…

力扣每日一题53:最大子数组和

题目描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,…

oracle-AWR报告生成方法

AWR报告生成方法 1. 以oracle用户登陆服务器 2. 进入到要保存awr报告的目录 3. 以sysdba身份连接数据库 sqlplus / as sysdba4. 执行生成AWR报告命令 ?/rdbms/admin/awrrpt.sql5. 选择AWR报告的文件格式 6. 选择生成多少天的AWR报告 7. 选择报告的快照起始和结束ID 8. 输入生…

MongoDB深度学习

MongoDB的简介 什么是MongoDB? MongoDB是一个基于分布式文件存储的数据库,由C语言编写。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散&…

面试算法31:最近最少使用缓存

题目 请设计实现一个最近最少使用(Least Recently Used,LRU)缓存,要求如下两个操作的时间复杂度都是O(1)。 get(key):如果缓存中存在键key,则返回它对应的值…

【二维差分】ICPC南京 A

https://codeforces.com/gym/104128/problem/A 题意 思路 二维差分经典模型 考虑如果没有洞那么经历操作之后会剩下什么样子的袋鼠。发现上下左右移动可以看成是边界在移动,边界一直保持一个原初的矩形形状,而且上下移动和左右移动没有任何关系。一旦…

【LeetCode刷题(数据结构与算法)】:将二叉搜索树转化为排序的双向链表

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点 特别地,我们希望可以 就地 完…

LAXCUS分布式操作系统是怎么实现的?

一直有网友要求讲讲LAXCUS分布式操作系统是怎么实现的,其实LAXCUS分布式操作系统的设计研发,涉及各种基础技术和底层架构,研发过程很漫长,一直在坚持,实现过程也非常复杂,尤其重要的是要保证运行过程&#…

前端 TS 快速入门之二:接口

1. 接口有什么用 通过 interface 定义接口。 检测对象的属性,不会去检查属性的顺序,只要相应的属性存在并且类型也是对的就可以。 interface IPerson {name: string;age: number; } function say(person: IPerson): void {console.log(my name is ${pers…

Elasticsearch 8.9 Master节点处理请求源码

大家看可以看ElasticSearch源码:Rest请求与Master节点处理流程(1) 这个图非常好,下午的讲解代码在各个类和方法之间流转,都体现这个图上 一、Master节点处理请求的逻辑1、节点(数据节点)要和主节点进行通讯&#xff0…

C语言常量

常量的概念 常量: 在程序运行期间不可以该改变的量 作用: 用于记录程序中不可更改的数据 常量的五种表现形式 语法: 1、数值常量(整数型常量(整数)、实数型常量(小数)&#xff09…

C++中的智能指针:更安全、更便利的内存管理

在C++编程中,动态内存管理一直是一个重要且具有挑战性的任务。传统的C++中,程序员需要手动分配和释放内存,这往往会导致内存泄漏和悬挂指针等严重问题。为了解决这些问题,C++11引入了智能指针(Smart Pointers)这一概念,它们是一种高级的内存管理工具,可以自动管理内存的…