python zsh:killed 正在进行大型矩阵计算

python zsh:killed in process of large sized matrix calculation

我的矩阵很大 aa的大小为2708*2708,类型为。我想使用 a.

计算一些更新方程

而计算过程是这样的:

adj = (a.dot(a.T) + a.T.dot(a)) / LA.norm(a.dot(a.T) + a.T.dot(a))
for k in range(1, 10):
    adj = (a.dot(adj).dot(a.T) +a.T.dot(adj).dot(a)) / (LA.norm(a.dot(adj).dot(a.T) + a.T.dot(eadj).dot(a)))

但这给了我

zsh: killed

我猜是矩阵的大小导致了这种情况,但我该如何防止这种情况?

有没有办法在没有 killed 错误的情况下完成此计算?

对于发布的代码,我在我的系统上得到了一个输出。我正在使用 zsh shell 和 python 3.6。我假设您使用的是 numpy,因为问题中没有提及相同的内容。

可能有其他问题,而不是您的代码。通常,如果进程内存不足,则为 killed。您可以在另一个终端中使用 top 跟踪代码的内存。或者您可以先尝试使用较小尺寸的矩阵进行调试。

您正试图使用​​比实际需要多 1000 倍的内存。您不需要保留整个列表 zk,因为您从不使用除 zk[k-1] 之外的任何值。只需保留对计算的 last 值的引用,并在每次迭代时将其替换为下一个值。

不要在循环中放入条件来专门处理第一次迭代;只需将其作为循环前计算即可。

b = (a.dot(a.T) + a.T.dot(a)) / LA.norm((a.dot(a.T) + a.T.dot(a)))

for _ in range(1, 1000):  # One fewer iteration
   
    b = ((a.dot(b).dot(a.T) + a.T.dot(b).dot(a))
         / LA.norm((a.dot(b).dot(a.T) + a.T.dot(b).dot(a))))

print(b)

您似乎也做了不必要的工作;在每一步中使用相同的值作为分子和分母的参数,但是您计算了两次。

tmp1 = a.dot(a.T) + a.T.dot(a)
b = tmp1 / LA.norm(tmp1)

for _ in range(1, 1000):
    tmp1 = a.dot(b).dot(a.T) + a.T.dot(b).dot(a)
    b = tmp1 / LA.norm(tmp1)

print(b)