我在某些程序包中构造了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
的属性和方法。它的内部数据可能已经是稀疏格式。