LinearOperator#
- class scipy.sparse.linalg.LinearOperator(*args, **kwargs)[源代码]#
执行矩阵向量乘法的通用接口
许多迭代方法(例如 cg,gmres)不需要知道矩阵的各个条目即可求解线性系统 A@x=b。此类求解器仅需要计算矩阵向量乘积 A@v,其中 v 是一个密集向量。此类充当迭代求解器和类矩阵对象之间的抽象接口。
要构造一个具体的 LinearOperator,可以将适当的可调用对象传递给此类的构造函数,或者对其进行子类化。
子类必须实现方法
_matvec
和_matmat
中的一个,以及属性/属性shape
(整数对)和dtype
(可能为 None)。它可以调用此类上的__init__
来验证这些属性。实现_matvec
会自动实现_matmat
(使用朴素算法),反之亦然。可选地,子类可以实现
_rmatvec
或_adjoint
来实现厄米共轭(共轭转置)。与_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) 的密集矩阵。
另请参阅
aslinearoperator
构造 LinearOperators
注释
用户定义的 matvec() 函数必须正确处理 v 的形状为 (N,) 以及 (N,1) 的情况。返回类型的形状由 LinearOperator 在内部处理。
强烈建议显式指定 dtype,否则将自动确定,代价是在使用输出的提升 dtype 的 int8 零向量上进行单次 matvec 应用。Python int 可能难以在
matvec
的定义中自动转换为 numpy 整数,因此该确定可能不准确。假设matmat
、rmatvec
和rmatmat
会在给定与matvec
相同的 int8 输入的情况下产生相同的输出 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.])
- 属性:
- argstuple
对于描述其他线性运算符的乘积等的线性运算符,二元运算的操作数。
- ndimint
维数(始终为 2)
方法
__call__
(x)将自身作为函数调用。
adjoint
()厄米共轭。
dot
(x)矩阵-矩阵或矩阵-向量乘法。
matmat
(X)矩阵-矩阵乘法。
matvec
(x)矩阵-向量乘法。
rmatmat
(X)伴随矩阵-矩阵乘法。
rmatvec
(x)伴随矩阵-向量乘法。
转置此线性运算符。
__mul__