克隆号

图片

一个小模块,用于在Python中使用数组而不使用第三方库(NumPy克隆,但仅在纯Python中)。

该大学的作业被要求编写一个程序来计算矩阵的范数和分解,但被禁止使用第三方库。 编程语言的选择不受限制。 我选择了python(这是一个错误,因为它比Java和C / C ++慢得多),因此我不能使用NumPy。 在此过程中,我不得不编写用于执行数组操作的函数,用于查找未成年人,行列式的函数等。 结果是一个用于处理数组的迷你库。

我的纯Python代码比NumPy慢得多,后者执行C和Fortran计算(加上我的代码未优化)。

MatLOL可以做什么:

  • 矩阵的总和,差和积
  • 矩阵产品的数量
  • 矩阵转置
  • 次矩阵
  • 矩阵行列式
  • 逆矩阵
  • 联合矩阵
  • 矩阵条件编号
  • 第一,第二(未最终确定),欧几里得和无限矩阵范数
  • 方程AX = B的解
  • LU分解
  • 胆固醇分解
  • 赛德尔法

MathLOL示例


导入模块:

# from mathlol import * from mathlol import mathlol 

矩阵初始化

 matrix = mathlol() matrix.set([[1, 2, 3], [4, 5, 6], [7, -8, 9]]) matrix.get() #   

一些矩阵运算

 matrix * 2 #     2 A = [[0, 0, 0], [0, 1, 0], [0, 0, 0]] #  2  matrix.dot(A) matrix * A matrix.transposition() #   matrix.minor(i = 0, j = 0) #   matrix.determinant() #   matrix.inverse() #   L, U = matrix.lu() # LU  matrix.seidel(b = [[5.0], [9.0], [1.0]]) #   

还有用于向量的功能

 vector = mathlol() vector.set([1, 2, 3, 4, 5]) vector.checkvector() # ,     vector.norm1_vector() vector.norm2_vector() vector.norm3_vector() 

其他例子

MathLOL性能


让我们看看计算大小为NxN的矩阵的乘积的速度。 矩阵由-100到100的随机整数填充。

代号
 from mathlol import mathlol import time import random import matplotlib.pyplot as plt #    data = {} for i in range(10, 110, 10): array = [] for i_ in range(i): temp = [] for j_ in range(i): temp.append(random.randint(-100, 100)) array.append(temp) data[i] = array #      mlol_dot = {} for key in data.keys(): matrix = mathlol() matrix.set(matrix = data[key]) start = time.process_time() result = matrix * matrix end = time.process_time() - start mlol_dot[key] = end #   plt.plot(mlol_dot.keys(), mlol_dot.values()) plt.title("MathLOL \n ") plt.xlabel("  (NxN)") plt.ylabel(" ()") 


图片

计算矩阵产品尺寸从100x100到1000x1000的速度

图片

比较numpy和mathlol的计算速度。 不幸的是,mathlol的速度非常慢,我决定对numpy使用尺寸从100x100到1000x1000的矩阵,对mathlol使用10x10到​​100x100的矩阵。

图片

MathLOL在0.16秒内自行​​计算出矩阵100x100的乘积,而NumPy在0.002(!!!)秒内计算出矩阵1000x1000的乘积。 区别是巨大的。

我们的任务只是实现用于矩阵的各种功能,而我们所做的只是,但是使用大型矩阵的程序的运行速度不尽人意。 仍然需要完善程序,添加更多功能(例如,用于计算Todd数的功能),如果您看一下代码,指出错误并可能有助于完善代码,我将不胜感激。

仅此而已 ,代码和示例已发布在github上

PS在撰写本文的过程中,我想进行实验并将C / C ++嵌入到我的模块中。 我会在不久的将来解决这个问题,看看它与NumPy的表现有多接近。

Source: https://habr.com/ru/post/zh-CN477308/


All Articles