Blog of Li

个人Blog 一年更新约一次

0%

scipy.sparse.linalg 生成线性算子

1
2
3
4
import numpy as np
import scipy
import scipy.sparse
import scipy.sparse.linalg

首先我们定义一个线性算子,不妨就定义一个恒同变换

1
2
3
def identity(x):
return np.matmul(np.eye(3),x)
identity([1.,2.,3.])
array([ 1.,  2.,  3.])

之后我们定义一个类,具有matvec和shape两个属性,并声明一个matvec为我们刚建立的identity的linearfun对象。

1
2
3
4
5
6
class linearfun(object):
def __init__(self,func,shape):
self.shape = shape
self.matvec = func
identityobj=linearfun(identity,(3,3))
print(identityobj.shape,identityobj.matvec([1.,2.,3.]))
(3, 3) [ 1.  2.  3.]

现在我们就可以使用scipy.sparse.linalg.aslinearoperator来将这个对象转换为一个scipy.sparse支持的线性算子了。也就可以使用scipy.sparse.linalg中的各种方法了。

1
2
identityop=scipy.sparse.linalg.aslinearoperator(identityobj)
print(scipy.sparse.linalg.cg(identityop,[1.,2.,3.]))
(array([ 1.,  2.,  3.]), 0)

我们其实还可以直接构造一个函数linearwrapper,直接就能把一个线性函数封装为一个scipy中的linearoperator

1
2
3
4
5
6
7
class linearfun(object):
def __init__(self,func,shape):
self.shape = shape
self.matvec = func
def linearwrapper(func,shape):
return scipy.sparse.linalg.aslinearoperator(linearfun(func,shape))
linearwrapper(identity,(3,3))([1.,2.,3.])
array([ 1.,  2.,  3.])