scipy.sparse.linalg.

LinearOperator#

class scipy.sparse.linalg.LinearOperator(*args, **kwargs)[source]#

执行矩阵向量乘法的通用接口

许多迭代方法(例如 cggmres)不需要知道矩阵的单个元素来求解线性系统 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^HA 的共轭转置。

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)

共轭矩阵-向量乘法。

transpose()

转置此线性算子。

__mul__

另请参阅

aslinearoperator

构造 LinearOperator

备注

用户定义的 matvec 函数必须正确处理 v 形状为 (N,)(N,1) 的情况。返回值的形状由 LinearOperator 内部处理。

强烈建议明确指定 dtype,否则会通过对 int8 零向量应用一次 matvec,并使用输出的提升 dtype 来自动确定,这会带来一定的开销。在 matvec 的定义中,Python int 可能难以自动转换为 numpy 整数,因此确定结果可能不准确。假设在给定 int8 输入的情况下,matmatrmatvecrmatmat 的输出 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.])