稀疏矩阵格式(dok)假设字典中没有的键值等于零。有没有办法让它使用除零以外的默认值?另外,是否有方法计算稀疏矩阵的对数(类似于正则numpy矩阵中的np.log)?
k4ymrczo1#
这个特性不是内置的,但是如果你真的需要这个特性,你应该能够编写你自己的dok_matrix类,或者Scipy的子类。Scipy的实现是here。至少在调用dict.*的地方,默认值需要改变---也许还有一些其他的改变需要做。然而,我会尝试重新表述这个问题,这样就不需要了。例如,如果你做线性代数,你可以分离出常数项,然后做
dok_matrix
dict.*
from scipy.sparse.linalg import LinearOperator A = whatever_dok_matrix_minus_constant_term def my_matvec(x): return A*x + constant_term * x.sum() op = LinearOperator(A.shape, matvec=my_matvec)
对于大多数线性代数例程(例如迭代求解器),您可以传入op而不是A。关于矩阵对数:稀疏矩阵的对数(如scipy.linalg.logm)通常是稠密的,因此您应该先将矩阵转换为稠密矩阵,然后像往常一样计算对数。据我所知,使用稀疏矩阵不会给予性能。如果您只需要计算向量与对数的乘积,log(A) * v向量,一些Krylov方法可能会有所帮助。如果你想按元素计算对数,你可以直接修改.data属性(至少在COO,CSR和CSC中可用)
op
A
scipy.linalg.logm
log(A) * v
.data
x = A.tocoo() x.data = np.log(x.data) A = x.todok()
这使得零元素单独存在,但如上所述,这允许单独处理常数部分。
1条答案
按热度按时间k4ymrczo1#
这个特性不是内置的,但是如果你真的需要这个特性,你应该能够编写你自己的
dok_matrix
类,或者Scipy的子类。Scipy的实现是here。至少在调用dict.*
的地方,默认值需要改变---也许还有一些其他的改变需要做。然而,我会尝试重新表述这个问题,这样就不需要了。例如,如果你做线性代数,你可以分离出常数项,然后做
对于大多数线性代数例程(例如迭代求解器),您可以传入
op
而不是A
。关于矩阵对数:稀疏矩阵的对数(如
scipy.linalg.logm
)通常是稠密的,因此您应该先将矩阵转换为稠密矩阵,然后像往常一样计算对数。据我所知,使用稀疏矩阵不会给予性能。如果您只需要计算向量与对数的乘积,log(A) * v
向量,一些Krylov方法可能会有所帮助。如果你想按元素计算对数,你可以直接修改
.data
属性(至少在COO,CSR和CSC中可用)这使得零元素单独存在,但如上所述,这允许单独处理常数部分。