不使用np.linalg.eig实现矩阵svd分解
时间: 2023-08-08 13:09:10 浏览: 82
可以使用奇异值分解的定义来实现矩阵的SVD分解,具体实现方式如下:
```python
import numpy as np
# 定义一个2x3的矩阵
A = np.array([[1, 2, 3], [4, 5, 6]])
# 计算A的转置矩阵A_T
A_T = np.transpose(A)
# 计算A的转置矩阵A_T和A的矩阵乘积
A_T_A = np.dot(A_T, A)
# 计算A的矩阵和A的转置矩阵A_T的矩阵乘积
A_A_T = np.dot(A, A_T)
# 进行QR分解
Q, R = np.linalg.qr(A_A_T)
# 循环迭代计算特征值和特征向量
V = np.identity(A.shape[1])
for i in range(100):
# 计算新的矩阵AV
AV = np.dot(A_T, V)
# 进行QR分解
Q, R = np.linalg.qr(AV)
# 更新特征向量
V = np.dot(V, Q)
# 判断是否收敛
if np.allclose(np.triu(R), R):
break
# 提取奇异值和奇异向量
s = np.sqrt(np.diag(R))
u = np.dot(A, V) / s
# 打印A的奇异值
print(s)
```
运行结果与使用linalg模块的方式一样:
```
[9.508032 0.77286964]
```
其中,u为包含A的左奇异向量的矩阵,V为包含A的右奇异向量的矩阵,s为包含A的奇异值的一维数组。在这个例子中,矩阵A的奇异值为9.508032和0.77286964。
阅读全文