python zsh:killed 正在进行大型矩阵计算
python zsh:killed in process of large sized matrix calculation
我的矩阵很大 a
。 a
的大小为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)
我的矩阵很大 a
。 a
的大小为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)