Python 矢量化(手动)正向替换

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 我想知道做一些减法累加来消除

我是求解线性系统的手写代码(我知道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 

我想知道做一些减法累加来消除循环是否可行,或者这看起来是否尽可能“矢量化”

方程
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:仅应使用循环的
下三角部分