Pygorithm项目中的矩阵操作实现详解
2025-07-08 07:41:21作者:尤峻淳Whitney
矩阵操作概述
矩阵是数学和计算机科学中非常重要的数据结构,广泛应用于图形学、机器学习、物理模拟等领域。Pygorithm项目中的matrix_operations.py文件实现了一系列基础的矩阵操作,包括加法、减法、乘法、转置、旋转以及路径计数等功能。
矩阵类设计
该模块定义了一个Matrix
类,通过面向对象的方式封装了各种矩阵操作:
class Matrix(object):
def __init__(self, matrix_one=None, matrix_two=None):
self.matrix_one = matrix_one
self.matrix_two = matrix_two
构造函数接受两个矩阵作为参数,后续的操作方法将基于这两个矩阵进行。
基础矩阵运算
矩阵加法
矩阵加法要求两个矩阵必须具有相同的维度:
def add(self):
if not (len(self.matrix_one) == len(self.matrix_two)) or not (len(self.matrix_one[0]) == len(self.matrix_two[0])):
raise Exception('Both Matrices should be of same dimensions')
added_matrix = [[0 for i in range(len(self.matrix_one))] for j in range(len(self.matrix_two))]
for row in range(len(self.matrix_one)):
for column in range(len(self.matrix_one[0])):
added_matrix[row][column] = self.matrix_one[row][column] + self.matrix_two[row][column]
return added_matrix
实现原理:
- 首先检查两个矩阵的维度是否一致
- 创建一个与输入矩阵相同维度的结果矩阵
- 遍历每个元素,将对应位置的元素相加
矩阵减法
矩阵减法与加法类似,也需要维度相同的矩阵:
def subtract(self):
# 维度检查与加法相同
subtracted_matrix = [[0 for i in range(len(self.matrix_one))] for j in range(len(self.matrix_two))]
for row in range(len(self.matrix_one)):
for column in range(len(self.matrix_one[0])):
subtracted_matrix[row][column] = self.matrix_one[row][column] - self.matrix_two[row][column]
return subtracted_matrix
矩阵乘法
矩阵乘法相对复杂,不要求两个矩阵维度相同,但要求第一个矩阵的列数等于第二个矩阵的行数:
def multiply(self):
multiplied_matrix = [[0 for i in range(len(self.matrix_two[0]))] for j in range(len(self.matrix_one))]
for row_one in range(len(self.matrix_one)):
for column in range(len(self.matrix_two[0])):
for row_two in range(len(self.matrix_two)):
multiplied_matrix[row_one][column] += self.matrix_one[row_one][row_two] * self.matrix_two[row_two][column]
return multiplied_matrix
实现原理:
- 结果矩阵的行数等于第一个矩阵的行数,列数等于第二个矩阵的列数
- 使用三重循环实现矩阵乘法
- 内层循环计算点积
矩阵变换操作
矩阵转置
矩阵转置是将矩阵的行列互换的操作:
def transpose(self):
transpose_matrix = [[0 for i in range(len(self.matrix_one))] for j in range(len(self.matrix_one[0]))]
for row in range(len(self.matrix_one)):
for column in range(len(self.matrix_one[0])):
transpose_matrix[column][row] = self.matrix_one[row][column]
return transpose_matrix
矩阵旋转
矩阵旋转操作将矩阵元素顺时针旋转:
def rotate(self):
top = 0
bottom = len(self.matrix_one) - 1
left = 0
right = len(self.matrix_one[0]) - 1
while left < right and top < bottom:
# 保存下一个元素
prev = self.matrix_one[top + 1][left]
# 向右移动顶部行
for i in range(left, right + 1):
curr = self.matrix_one[top][i]
self.matrix_one[top][i] = prev
prev = curr
top += 1
# 向下移动最右列
for i in range(top, bottom+1):
curr = self.matrix_one[i][right]
self.matrix_one[i][right] = prev
prev = curr
right -= 1
# 向左移动底部行
for i in range(right, left-1, -1):
curr = self.matrix_one[bottom][i]
self.matrix_one[bottom][i] = prev
prev = curr
bottom -= 1
# 向上移动最左列
for i in range(bottom, top-1, -1):
curr = self.matrix_one[i][left]
self.matrix_one[i][left] = prev
prev = curr
left += 1
return self.matrix_one
实现原理:
- 使用四个指针(top, bottom, left, right)标记当前处理的边界
- 分层处理,从外向内
- 每次处理一层,顺时针移动元素
高级矩阵操作
唯一路径计数
这是一个经典的动态规划问题,计算从矩阵左上角到右下角的唯一路径数:
def count_unique_paths(self, m, n):
if m < 1 or n < 1:
return
count = [[None for j in range(n)] for i in range(m)]
# 边界条件处理
for i in range(n):
count[0][i] = 1
for j in range(m):
count[j][0] = 1
# 动态规划填充
for i in range(1, m):
for j in range(1, n):
count[i][j] = count[i-1][j] + count[i][j-1]
return count[m-1][n-1]
算法分析:
- 时间复杂度:O(mn)
- 空间复杂度:O(mn)
- 基于动态规划思想,每个位置的路径数等于上方和左方位置路径数之和
使用示例
# 创建矩阵实例
mat1 = [[1, 2], [3, 4]]
mat2 = [[5, 6], [7, 8]]
matrix = Matrix(mat1, mat2)
# 矩阵加法
print(matrix.add()) # 输出: [[6, 8], [10, 12]]
# 矩阵乘法
print(matrix.multiply()) # 输出: [[19, 22], [43, 50]]
# 矩阵转置
matrix = Matrix(mat1)
print(matrix.transpose()) # 输出: [[1, 3], [2, 4]]
# 唯一路径计数
print(matrix.count_unique_paths(3, 3)) # 输出: 6
总结
Pygorithm中的矩阵操作实现涵盖了基础的矩阵运算和部分高级操作,代码清晰易懂,适合学习矩阵运算的基本原理。对于初学者来说,这是一个很好的学习资源,可以帮助理解矩阵运算在编程中的实现方式。
在实际应用中,对于大规模矩阵运算,建议使用专门的数值计算库如NumPy,它们经过了高度优化,性能更好。但这些基础实现对于理解矩阵运算的原理非常有帮助。