Sd[:d*K, :d*K*N] = np.diag(S[:d*K]) ValueError: could not broadcast input array from shape (1200,1200) into shape (65536,19200)
时间: 2024-03-11 17:48:41 浏览: 114
oom-diag:java.lang.OutOfMemoryError 的决策树
这个错误是因为在构造对角矩阵Sd的时候,使用了错误的数组形状。S的形状为(K,),而Sd的形状应该为(Kd*K, Kd*N),因为低秩矩阵Ud的形状为(K, Kd),而重构矩阵M_rec的形状为(K, N),因此Sd应该是一个(Kd*K, Kd*N)的矩阵。以下是修改后的代码:
```
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 读取数据矩阵
M = np.load('data.npy')
K, N = M.shape
d = 16
# 将M分解为U、S、V矩阵,其中U、V为正交矩阵,S为对角矩阵,对角线上的元素为奇异值
U, S, V = np.linalg.svd(M, full_matrices=False)
# 输出奇异值
print('Singular values:')
print(S)
# 取前Kd个奇异值,构造对角矩阵Sd
Sd = np.zeros((d*K*K, d*N))
Sd[:d*K, :d*K] = np.diag(S[:d*K])
# 构造低秩矩阵Ud和Id
Ud = U[:, :d*K]
Id = V[:d*N, :].T
# 输出低秩矩阵Ud的形状
print('Ud shape:')
print(Ud.shape)
# 将Ud中的每一列reshape为图像并输出
for i in range(d*K):
img = Ud[:, i].reshape(K, 1)
plt.imshow(img, cmap='gray')
plt.show()
# 构造重构矩阵M_rec
M_rec = np.dot(Ud, np.dot(Sd, Id.T))
# 输出前20个重构的RGB图像并显示
for i in range(20):
img = M_rec[:, i*3:(i+1)*3]
img = img.reshape(K, N, 3)
img = np.clip(img, 0, 255)
img = Image.fromarray(np.uint8(img))
img.show()
```
在这个修改后的代码中,我们将Sd的形状修改为(dK*K, dKN),并将对角矩阵S[:dK]放置在Sd的左上角。这样就可以避免上述的ValueError错误了。
阅读全文