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.])