在运行ksvd的python代码过程成中,这次跑了一个新的矩阵,结果出现了一个红色的提示信息:init_dgesdd failed init
。
具体如图所示:
既不是报错,也不是异常,但是最后的结果很明显不对。
在百度上查询,根本就没有查到这个问题,只好出去google了一下。最终应该是得到了解决。之前对矩阵进行分解就没有问题,怎么这次就出现了问题呢?
原因在于,我的这个矩阵太大了。
问题出在u, s, v = np.linalg.svd(y)
这一行代码上。
stackoom给的回答是问题来自内存,由于矩阵太大,导致内存缓冲区的内存分配失败。在该内存缓冲区中,需要用于存储U,S,VT以及svd期间所有的中间数组。
然后继续查询,在一个github的讨论上看到了另外一哥们的报错信息:
Traceback (most recent call last):
File "bug.py", line 11, in <module>
U, S, V = svd(K, full_matrices=True)
File "/nfs/software/stegle/users/horta/conda-envs/exp2/lib/python3.5/site-packages/scipy/linalg/decomp_svd.py", line 112, in svd
compute_uv=compute_uv, full_matrices=full_matrices)
File "/nfs/software/stegle/users/horta/conda-envs/exp2/lib/python3.5/site-packages/scipy/linalg/lapack.py", line 488, in _compute_lwork
raise ValueError("Too large work array required -- computation cannot "
ValueError: Too large work array required -- computation cannot be performed with standard 32-bit LAPACK.
最后一句是经典,解释了原因所在。矩阵太大,同时那啥32位的LAPACK不能计算svd。
这里应该是Numpy为LAPACK的初始化失败而抛出的异常。
然后Numpy用的是32位的LAPACK,而不是64位的。
原因在此,我打算换个小点的矩阵,暂时无其他解决办法。5555