我在某些程序包中构造了LinearOperator。我想计算一个iLU前置条件,并在scipy解算器中使用它。
问题是用于预处理器的输入对象的类型。如果要使用“ spilu”函数,则应在输入中使用numpy数组,但是我有一个LinearOperator!
因此,如何将LinearOperator转换为numpy数组?还是存在其他计算iLU预条件器的方法?

最佳答案

获取与LinearOperator关联的矩阵的一种方法是将其乘以单位矩阵。

在此示例中,op是形状为(3,3)的LinearOperator

In [103]: op
Out[103]: <3x3 MyOperator with dtype=int64>


这是与op关联的实际矩阵:

In [104]: op * np.eye(op.shape[1], dtype=op.dtype)
Out[104]:
array([[1, 2, 0],
       [3, 4, 5],
       [0, 6, 7]])


警告! np.eye()创建一个密集数组,上面的乘法返回一个密集的numpy数组。如果LinearOperator的形状太大,可能会耗尽内存。

LinearOperator到稀疏矩阵而不生成中间密集数组是可能的,但是将需要更多代码。在花费太多时间之前,请检查所具有的特定LinearOperator的属性和方法。它的内部数据可能已经是稀疏格式。

10-08 02:39