40,000 * 40,000
),所以我使用scispy.稀疏格式存储它的一半,下面是我的代码
import numpy as np
from scipy.sparse import coo_matrix
def to_sparse(W):
tmp = np.tril(W)
del W
return coo_matrix(tmp)
然后我要计算W
(对称的拉普拉斯矩阵),根据公式L = D - W
(其中D
是对角线矩阵,其对角线是W
的列或行的和),根据L
的定义,我需要检查它是否是半正定的(PSD)。
但是,计算稀疏格式存储的'L'
的特征值似乎并不等同于原始问题,所以我必须将L
转换为密集格式,然后检查?我的问题:有没有更好的方法来实现这一点而不将L
转换回稠密矩阵?下面是我生成L
并检查PSD的代码:
很抱歉在上传之前没有检查代码示例,现在我已经修复了这些错误,下面是一个示例:
W = np.random.random_integers(1, 100, size = (100, 100))
W = .5 * (W + W.T)
W = to_sparse(W)
L = gen_laplacian(W)
原始数组是否已经稀疏(大量的零),或者那些仅仅是
tril
的乘积?如果是后者,则使用稀疏代码可能无法节省空间或时间。例如对于这个100x100测试,比
^{pr2}$gen_laplacian(to_sparse(W))
快8倍。在甚至
check(L.A)
也快2倍。在但是你需要构造
orginal_L
?看起来linalg.eigh(L.A)
会产生相同的结果,因为the calculation is done with the lower triangular part
。并不是说构造orginal_L
需要很多时间。在但测试问题的关键在于,像
eigsh
这样的sparse.linalg
函数是否产生与eigh
等价的东西。在我对这些
eigh
函数了解得不够多,不深入了解文档就可以了。在相关问题 更多 >
编程相关推荐