我在某些程序包中构造了一个LinearOperator。我想计算一个iLU预处理器并在scipy求解器中使用它。 问题是预处理器计算的输入对象的类型。如果你想使用“spilu”函数你应该在输入中使用numpy数组,但我有一个LinearOperator! 因此,如何将LinearOperator转换为numpy数组?或者是否存在计算iLU预处理器的其他方法?
答案 0 :(得分:1)
您可以获得与LinearOperator
相关联的矩阵的一种方法是将其乘以单位矩阵。
在此示例中,op
是LinearOperator
形状(3,3):
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
的属性和方法。它可能具有稀疏格式的内部数据。