LinearOperator#
- class scipy.sparse.linalg.LinearOperator(*args, **kwargs)[source]#
执行矩阵向量乘法的通用接口
许多迭代方法(例如
cg
、gmres
)不需要知道矩阵的单个元素来求解线性系统A@x = b
。这些求解器只需要计算矩阵向量积A@v
,其中v
是一个稠密向量。此类别充当迭代求解器和类矩阵对象之间的抽象接口。要构造一个具体的
LinearOperator
,可以向此类的构造函数传递适当的可调用对象,或者继承此类别。子类必须实现方法
_matvec
和_matmat
中的一个,以及属性/特性shape
(整数对)和dtype
(可以是 None)。它可以调用此类的__init__
方法来验证这些属性。实现_matvec
会自动实现_matmat
(使用朴素算法),反之亦然。可选地,子类可以实现
_rmatvec
或_adjoint
来实现 Hermitian 共轭(共轭转置)。与_matvec
和_matmat
类似,实现_rmatvec
或_adjoint
中的任何一个都会自动实现另一个。推荐实现_adjoint
;_rmatvec
主要用于向后兼容。- 参数:
- shapetuple
矩阵维度
(M, N)
。- matvec可调用对象 f(v)
返回
A @ v
。- rmatvec可调用对象 f(v)
返回
A^H @ v
,其中A^H
是A
的共轭转置。- matmat可调用对象 f(V)
返回
A @ V
,其中V
是维度为(N, K)
的稠密矩阵。- dtypedtype
矩阵的数据类型。
- rmatmat可调用对象 f(V)
返回
A^H @ V
,其中V
是维度为(M, K)
的稠密矩阵。
- 属性:
- argstuple
对于描述其他线性算子的积等的线性算子,表示二元运算的操作数。
- ndimint
维度数(始终为 2)
方法
__call__
(x)将自身作为函数调用。
adjoint
()Hermitian 共轭。
dot
(x)矩阵-矩阵或矩阵-向量乘法。
matmat
(X)矩阵-矩阵乘法。
matvec
(x)矩阵-向量乘法。
rmatmat
(X)共轭矩阵-矩阵乘法。
rmatvec
(x)共轭矩阵-向量乘法。
转置此线性算子。
__mul__
另请参阅
aslinearoperator
构造 LinearOperator
备注
用户定义的
matvec
函数必须正确处理v
形状为(N,)
和(N,1)
的情况。返回值的形状由LinearOperator
内部处理。强烈建议明确指定 dtype,否则会通过对
int8
零向量应用一次 matvec,并使用输出的提升 dtype 来自动确定,这会带来一定的开销。在matvec
的定义中,Pythonint
可能难以自动转换为 numpy 整数,因此确定结果可能不准确。假设在给定int8
输入的情况下,matmat
、rmatvec
和rmatmat
的输出 dtype 将与matvec
的输出 dtype 相同。LinearOperator 实例也可以相互乘、加和求幂,所有这些都是惰性执行的:这些操作的结果始终是一个新的复合 LinearOperator,它将线性操作委托给原始算子并组合结果。
有关如何继承 LinearOperator 和具体 LinearOperator 实例的更多详细信息和示例,请参见外部项目 PyLops。
示例
>>> import numpy as np >>> from scipy.sparse.linalg import LinearOperator >>> def mv(v): ... return np.array([2*v[0], 3*v[1]]) ... >>> A = LinearOperator((2,2), matvec=mv) >>> A <2x2 _CustomLinearOperator with dtype=int8> >>> A.matvec(np.ones(2)) array([ 2., 3.]) >>> A @ np.ones(2) array([ 2., 3.])