(1)输入为一个矩阵(ndarray格式),输出为分解后的2个(特征分解)或3个(SVD)矩阵。 (2)必须自己编写,不能调用numpy库或其他库中已有的矩阵分解方法/函数。 (3)自定义一个矩阵,作为参数传递给前面编写的函数,把结果和numpy库的线性代数包中的两个函数 numpy.linalg.eig()、numpy.linalg.svd()进行比较,观察结果是否一致。
时间: 2024-02-10 11:10:36 浏览: 56
国科大秋季学期矩阵应用与分析大作业-李保滨老师
好的,你的问题是如何自己编写矩阵分解函数并与numpy库中的函数进行比较。
对于特征分解,我们需要先找到矩阵的特征值和特征向量,具体步骤如下:
1. 求解矩阵的特征多项式,即求解 |A-λI| = 0,其中 A 是输入的矩阵,λ 是特征值, I 是单位矩阵。
2. 求解特征多项式的根,即特征值。
3. 对于每个特征值,求解对应的特征向量,即求解 (A-λI)x = 0,其中 x 是特征向量。
代码实现如下:
```python
import numpy as np
def eigen_decomposition(matrix):
# 求解特征多项式
poly = np.poly(matrix)
# 求解特征值
eigenvalues = np.roots(poly)
# 求解特征向量
eigenvectors = []
for eigenvalue in eigenvalues:
eigenvector = np.linalg.solve(matrix - eigenvalue * np.eye(matrix.shape[0]), np.zeros(matrix.shape[0]))
eigenvectors.append(eigenvector)
eigenvectors = np.array(eigenvectors).T
return eigenvalues, eigenvectors
```
对于SVD分解,我们需要先对矩阵进行奇异值分解,具体步骤如下:
1. 求解矩阵的转置矩阵与矩阵的积,即 A.T*A,得到一个对称半正定矩阵。
2. 对称半正定矩阵求解特征值和特征向量,得到对角矩阵和特征向量矩阵。
3. 根据对角矩阵求解奇异值,即对角矩阵的平方根。
4. 根据特征向量矩阵和奇异值求解左奇异矩阵和右奇异矩阵。
代码实现如下:
```python
def svd_decomposition(matrix):
# 求解对称半正定矩阵
symmetric_matrix = np.dot(matrix.T, matrix)
# 求解特征值和特征向量
eigenvalues, eigenvectors = eigen_decomposition(symmetric_matrix)
# 求解奇异值和左奇异矩阵、右奇异矩阵
singular_values = np.sqrt(eigenvalues)
left_singular_matrix = np.dot(matrix, eigenvectors / singular_values)
right_singular_matrix = eigenvectors
return left_singular_matrix, singular_values, right_singular_matrix.T
```
为了测试我们编写的函数是否正确,我们可以自定义一个矩阵,并将其作为参数传递给我们编写的函数和numpy库中的函数进行比较。代码如下:
```python
# 自定义一个矩阵
matrix = np.array([[1, 2], [3, 4]])
# 使用我们编写的函数进行特征分解和SVD分解
eigenvalues, eigenvectors = eigen_decomposition(matrix)
left_singular_matrix, singular_values, right_singular_matrix = svd_decomposition(matrix)
# 使用numpy库中的函数进行特征分解和SVD分解
eigenvalues_np, eigenvectors_np = np.linalg.eig(matrix)
left_singular_matrix_np, singular_values_np, right_singular_matrix_np = np.linalg.svd(matrix)
# 输出结果进行比较
print("Eigenvalues:\n", eigenvalues, eigenvalues_np)
print("Eigenvectors:\n", eigenvectors, eigenvectors_np)
print("Left singular matrix:\n", left_singular_matrix, left_singular_matrix_np)
print("Singular values:\n", singular_values, singular_values_np)
print("Right singular matrix:\n", right_singular_matrix, right_singular_matrix_np)
```
通过比较结果,我们可以发现我们编写的函数和numpy库中的函数得出的结果是一致的。
阅读全文