scipy.sparse.linalg.

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,否则将自动确定,代价是在使用输出的提升 dtypeint8 零向量上进行单次 matvec 应用。Python int 可能难以在 matvec 的定义中自动转换为 numpy 整数,因此该确定可能不准确。假设 matmatrmatvecrmatmat 会在给定与 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)

伴随矩阵-向量乘法。

transpose()

转置此线性运算符。

__mul__