You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无主元LU分解变体算法实现问询:行建L与列建U代码补全

无主元LU分解变体算法补全

要实现无主元LU分解的变体,对n×n矩阵A进行原地覆盖存储——严格下三角部分(不含主对角线)存储L(单位下三角矩阵,对角线元素为1),上三角部分存储U。

经典实现参考

# classical implementation (originated in gaussian-elimination)
for i = 1, ..., n-1 do 
    for j = i + 1, …, n do
        A_j,i = A_j,i / A_i,i;              # update L
        for k = i + 1, …, n do
            A_j,k = A_j,k - A_j,i * A_i,k;  # update U
        end for
    end for
end for

变体算法补全

你提到的变体采用行式构建L、列式构建U,且每个非平凡元素仅修改一次。结合LU分解的数学定义,补全后的算法如下:

L元素更新逻辑

对于严格下三角位置(i,j)(i>j),根据矩阵乘法等式A = L*U推导可得:需要先减去已计算的L元素与对应U元素的乘积和,再除以U的主元A_j,j,代码实现如下:

temp = A_i,j
for k = 1, …, j - 1 do
    temp -= A_i,k * A_k,j
end for
A_i,j = temp / A_j,j;

U元素更新逻辑

你猜测的U更新代码是正确的:对于上三角位置(j+1,i)(j+1 < i),通过消去L的贡献得到U的最终值:

A_j+1,i = A_j+1,i - A_j+1,k * A_k,i;

完整变体代码

# variant
for i = 2, ..., n do 
    for j = 1, …, i - 1 do
        # 更新L的元素A[i][j]
        temp = A_i,j
        for k = 1, …, j - 1 do
            temp -= A_i,k * A_k,j
        end for
        A_i,j = temp / A_j,j;
        
        # 更新U的元素A[j+1][i]
        for k = 1, …, j do
            A_j+1,i = A_j+1,i - A_j+1,k * A_k,i;
        end for
    end for
end for

注意事项

  • 该算法要求矩阵A的所有顺序主子式非零,否则会出现除零错误(无主元LU分解的固有前提)。
  • 原地存储中,L的对角线元素固定为1,无需显式存储。

内容的提问来源于stack exchange,提问作者JonasFitzgerald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:35:04