如何解决向量化LU分解求解多个b
我正在用scipy的LU分解预处理形状为A
的二次矩阵(n,n)
,然后为形状为(...,n)
的多个右侧B反复求解。但是scipy.linalg.lu_solve
仅接受b的向量,而不接受(m,n)
或(k,m,n)
之类的矩阵。
如何包装lu_solve
以处理形状为(...,n)
的参数? Numpy的linalg.solve
可以接受多个b
,但不允许分离的LU因子和求解运算。
解决方法
lu_solve
的文档中未提及它,但实际上b
可以包含多个向量。如果A
具有形状(n,n)
,则b
可以具有形状(n,m)
。例如,
In [44]: A
Out[44]:
array([[ 1.01,0.02,-0.01],[ 0.02,1.04,-0.02],[-0.01,-0.02,1.01]])
In [45]: b
Out[45]:
array([[ 0,1,2,3],[ 4,5,6,7],[ 8,9,10,11]])
In [46]: lu = lu_factor(A)
In [47]: x = lu_solve(lu,b)
In [48]: x
Out[48]:
array([[ 0.,0.98113208,1.96226415,2.94339623],[ 4.,4.96226415,5.9245283,6.88679245],[ 8.,9.01886792,10.03773585,11.05660377]])
In [49]: A.dot(x)
Out[49]:
array([[ 0.,1.,2.,3.],5.,6.,7.],9.,10.,11.]])
高维b
必须具有形状(n,...)
。请注意,对于具有二维以上的形状,使用A.dot(x)
测试结果将不起作用,因为x
的形状将与NumPy的矩阵乘法不兼容。例如,这里B
的形状为(3,5)
:
In [40]: A
Out[40]:
array([[ 1.01,1.01]])
In [41]: B = np.random.rand(3,5)
In [42]: lu = lu_factor(A)
In [43]: x = lu_solve(lu,B)
In [44]: x.shape
Out[44]: (3,5)
In [45]: xx = np.moveaxis(x,1)
In [46]: np.allclose(A.dot(xx),B)
Out[46]: True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。