Python 矢量化(手动)正向替换
我是求解线性系统的手写代码(我知道NumPy可以用Python 矢量化(手动)正向替换,python,numpy,vectorization,Python,Numpy,Vectorization,我是求解线性系统的手写代码(我知道NumPy可以用np.linalg.solve或类似工具为我解决这个问题)。我想写的一个函数是用于正向代换的,即求解y的Ly=b,其中L是单位下三角矩阵,b是列向量 我提出了以下解决方案 def solve_forward(L, b): y = b.copy() for r in range(1, L.shape[0]): y[r] -= L[r, :r] @ y[:r] return y 我想知道做一些减法累加来消除
np.linalg.solve
或类似工具为我解决这个问题)。我想写的一个函数是用于正向代换的,即求解y
的Ly=b
,其中L
是单位下三角矩阵,b
是列向量
我提出了以下解决方案
def solve_forward(L, b):
y = b.copy()
for r in range(1, L.shape[0]):
y[r] -= L[r, :r] @ y[:r]
return y
我想知道做一些减法累加来消除循环是否可行,或者这看起来是否尽可能“矢量化” 方程
Ly=b
的解可以通过对矩阵L
求逆,然后在两边左乘得到:y=L'b
,其中L'
是L
的逆矩阵。可以使用例如np.linalg.inv
来反转此矩阵
在不使用numpy的情况下对矩阵进行求逆,将是一件乏味的事情。然而,我怀疑你可能可以做得很好,因为你有一个下三角单位矩阵
下三角单位矩阵L
,(对角线上也有1
s)的逆矩阵可以显示为
def Linv(i,j):
if i==j:
return 1
elif j==i-1:
return -1
也许有更好的计算方法,但这里有一种方法:
import numpy as np
from scipy.linalg import circulant
L=np.tril(np.ones((4,4)))
dim=L.shape[0]
Linv=[np.concatenate([np.array([1,-1]), np.zeros(dim-2)])]
Linv=np.tril(circulant(Linv))
print(Linv)
这里有更多的信息
现在,让我们一起来:
import numpy as np
from scipy.linalg import circulant
def L_inv(l_dim):
Linv=[np.concatenate([np.array([1,-1]), np.zeros(l_dim-2)])]
Linv=tril(circulant(Linv))
def solve_forward(L, b):
y = L_inv(L.shape[0]) @ b
return y
这应该像预期的那样起作用
编辑:在这种情况下,前面的toeplitz
不起作用。用更合适的循环切换它
编辑2:仅应使用循环的下三角部分