1. 项目背景与核心价值
这个名为"mylinear"的代码项目来自李哥项目班的实战教学内容,是一个典型的线性代数计算库实现。作为数学计算领域的基础设施,这类工具库在机器学习、科学计算、图形处理等场景中都有广泛应用。我在实际工程中多次遇到过需要自定义线性代数运算的情况,比如需要兼容特殊硬件平台时,现成的numpy可能无法满足需求。
这个项目最吸引我的地方在于它完整实现了线性代数中的核心运算,包括但不限于:
- 向量加减乘除
- 矩阵乘法
- 矩阵转置
- 行列式计算
- 矩阵求逆
2. 代码架构解析
2.1 核心类设计
项目采用面向对象的方式组织代码,主要包含三个核心类:
- Vector类
python复制class Vector:
def __init__(self, elements):
self.elements = elements
self.dim = len(elements)
def __add__(self, other):
# 向量加法实现
if self.dim != other.dim:
raise ValueError("向量维度不匹配")
return Vector([a + b for a, b in zip(self.elements, other.elements)])
- Matrix类
python复制class Matrix:
def __init__(self, rows):
self.rows = rows
self.shape = (len(rows), len(rows[0]))
def transpose(self):
# 矩阵转置实现
return Matrix([[row[i] for row in self.rows]
for i in range(self.shape[1])])
- LinearAlgebra类
python复制class LinearAlgebra:
@staticmethod
def dot_product(v1, v2):
# 点积运算
return sum(a * b for a, b in zip(v1.elements, v2.elements))
2.2 运算实现原理
矩阵乘法是本项目最复杂的部分之一,采用了经典的三重循环实现:
python复制def __mul__(self, other):
if self.shape[1] != other.shape[0]:
raise ValueError("矩阵维度不匹配")
result = []
for i in range(self.shape[0]):
row = []
for j in range(other.shape[1]):
sum_val = 0
for k in range(self.shape[1]):
sum_val += self.rows[i][k] * other.rows[k][j]
row.append(sum_val)
result.append(row)
return Matrix(result)
提示:在实际工程中,这种朴素实现性能较差,可以考虑使用分块矩阵算法优化,或者调用BLAS库。
3. 关键算法实现细节
3.1 行列式计算
项目采用递归法实现行列式计算,这是初学者最容易理解的方式:
python复制def determinant(matrix):
if matrix.shape[0] != matrix.shape[1]:
raise ValueError("必须为方阵")
n = matrix.shape[0]
if n == 1:
return matrix.rows[0][0]
det = 0
for col in range(n):
minor = Matrix([[matrix.rows[i][j] for j in range(n) if j != col]
for i in range(1, n)])
det += ((-1) ** col) * matrix.rows[0][col] * determinant(minor)
return det
3.2 矩阵求逆
基于伴随矩阵法实现求逆运算:
python复制def inverse(matrix):
det = determinant(matrix)
if det == 0:
raise ValueError("矩阵不可逆")
n = matrix.shape[0]
cofactors = []
for i in range(n):
cofactor_row = []
for j in range(n):
minor = Matrix([[matrix.rows[x][y] for y in range(n) if y != j]
for x in range(n) if x != i])
cofactor_row.append(((-1) ** (i + j)) * determinant(minor))
cofactors.append(cofactor_row)
adjugate = Matrix(cofactors).transpose()
return Matrix([[adjugate.rows[i][j] / det
for j in range(n)] for i in range(n)])
4. 性能优化实践
4.1 内存布局优化
原始实现使用列表存储矩阵元素,可以考虑改为numpy数组:
python复制import numpy as np
class OptimizedMatrix:
def __init__(self, data):
self.data = np.array(data, dtype=np.float64)
self.shape = self.data.shape
4.2 并行计算加速
利用多线程加速矩阵运算:
python复制from concurrent.futures import ThreadPoolExecutor
def parallel_matmul(a, b):
def compute_element(i, j):
return sum(a[i][k] * b[k][j] for k in range(a.shape[1]))
result = np.zeros((a.shape[0], b.shape[1]))
with ThreadPoolExecutor() as executor:
futures = []
for i in range(a.shape[0]):
for j in range(b.shape[1]):
futures.append(executor.submit(compute_element, i, j))
for idx, future in enumerate(futures):
i = idx // b.shape[1]
j = idx % b.shape[1]
result[i][j] = future.result()
return result
5. 测试与验证
5.1 单元测试设计
完善的测试用例是数学库可靠性的保证:
python复制import unittest
class TestLinearAlgebra(unittest.TestCase):
def test_vector_addition(self):
v1 = Vector([1, 2, 3])
v2 = Vector([4, 5, 6])
self.assertEqual((v1 + v2).elements, [5, 7, 9])
def test_matrix_multiplication(self):
m1 = Matrix([[1, 2], [3, 4]])
m2 = Matrix([[5, 6], [7, 8]])
result = m1 * m2
self.assertEqual(result.rows, [[19, 22], [43, 50]])
5.2 数值稳定性测试
特别关注边界条件下的表现:
python复制def test_near_singular(self):
# 接近奇异的矩阵
m = Matrix([[1, 2], [2, 4.0000001]])
inv = inverse(m)
# 验证 A*A^-1 ≈ I
product = m * inv
identity = Matrix([[1, 0], [0, 1]])
for i in range(2):
for j in range(2):
self.assertAlmostEqual(product.rows[i][j],
identity.rows[i][j],
places=6)
6. 工程化扩展
6.1 运算符重载
增强代码可读性:
python复制def __matmul__(self, other): # 矩阵乘法运算符 @
return self.__mul__(other)
def __pow__(self, power): # 矩阵幂运算
result = Matrix.identity(self.shape[0])
for _ in range(power):
result @= self
return result
6.2 类型注解支持
增加现代Python特性:
python复制from typing import List, Union
class Vector:
def __init__(self, elements: List[float]):
self.elements: List[float] = elements
self.dim: int = len(elements)
def norm(self, p: int = 2) -> float:
return sum(abs(x)**p for x in self.elements) ** (1/p)
7. 实际应用案例
7.1 线性回归实现
python复制def linear_regression(X: Matrix, y: Vector) -> Vector:
X_T = X.transpose()
X_T_X = X_T @ X
X_T_y = X_T @ y
theta = inverse(X_T_X) @ X_T_y
return theta
7.2 图像变换矩阵
python复制def rotation_matrix(theta: float) -> Matrix:
return Matrix([
[math.cos(theta), -math.sin(theta)],
[math.sin(theta), math.cos(theta)]
])
注意:在实际项目中,建议添加文档字符串和示例代码,方便其他开发者使用。