我在函数中有以下代码:
phi = fourier_matrix(y, fs)
N = np.size(phi,axis=1)
x = np.ones(N)
for i in range(136):
W_pk = np.diag(x)
temp = pinv(np.dot(phi, W_pk))
q_k = np.dot(temp, y)
x = np.dot(W_pk, q_k)
其中phi是(96,750),W_pk是(750,750),q_k是(750,)。
这将引发以下错误:
Python(12001,0x7fff99d8b380)malloc: *对象0x7fc71aa37200的错误:释放的对象的校验和不正确-释放后可能已修改了对象。 * 在malloc_error_break中设置一个断点进行调试
如果我评论最后一个点积,则不会出现错误。
我认为我需要以某种方式释放内存,或者以不同的方式做点积?
此外,仅当我从Mac运行它时,才会发生这种情况。在Windows或Linux上,它不会引发错误。
Python是3.6(尝试使用3.7),numpy是1.14.5,也尝试使用1.15
任何帮助将不胜感激,因为我确实需要完成这项工作!
谢谢。
编辑我: 我在jupyter笔记本上尝试了这部分代码,但没有失败。这让我更加困惑!当我在Mac上的Visual Studio Code中运行它时,它将失败。我的其余代码(一种从信号中去除伪像的算法)将按预期工作,直到我添加最后一段代码 x = np.dot(W_pk,q_k)。也许它可以在jupyter上运行,因为我不在那儿运行算法的其余部分?但正如我所说,它只会在最后一个点产品上崩溃。
编辑II:我在此问题的for循环上方添加了一段代码,因为我发现该问题与x的使用方式有关。您会看到它在上面被声明为float64 ndarray。当它到达for循环的最后一行时,点积将返回complex128(应该是complex64,不知道那里发生了什么)并覆盖x数组。第一次可以,但是第二次尝试覆盖时会崩溃。如果我对点积使用新变量,例如z,则不会崩溃!不知道为什么...但是我需要在每次迭代中覆盖x。
此外,如果我做这样的事情:
z = np.dot(W_pk, q_k)
x = abs(z) #I don't need complex numbers at this point
然后,它在第一个点乘积上崩溃并出现相同的错误(大概是这样):
temp = pinv(np.dot(phi, W_pk))
此外,内存消耗还算不错,根据一些测量,大约为110M,并且在iPython上,相同的算法不会导致内存使用率翻倍。这是我最不清楚的地方,为什么它不会在iPython上崩溃?