【问题标题】:Building a recursion function for LU decomposition in Julia在 Julia 中为 LU 分解构建递归函数
【发布时间】:2018-11-05 22:27:31
【问题描述】:

我对 Julia 很陌生,并尝试对我为递归 LU 分解编写的一些代码进行故障排除。 这是我所有的代码:

`using LinearAlgebra
function recurse_lu(A)
    n=size(A)[1]
    L=zeros(n,n)
    U=zeros(n,n)
    k=n/2
    convert(Int, k)
    A11=A[1:(k),1:(k)]
    A12=A[1:(k),(k+1):n]
    A21=A[(k+1):n,1:(k)]
    A22=A[(k+1):n,(k+1):n]
    if n>2
        L11,U11=recurse_lu(A11)
        L12=zeros(size(A11)[1],size(A11)[1])
        U21=zeros(size(A11)[1],size(A11)[1])
        U12=inv(L11)*A12
        L21=inv(U11)*A21
        L22,U22=recurse_lu(A22-L21*U12)
    else
        L11=1
        L21=A21/A11
        L22=1
        L12=0
        U21=0
        U12=A12
        U22=A22-L21*A12
        U11=A11
    end
    L[1:(k),1:(k)]=L11
    L[1:(k),(k+1):n]=L12
    L[(k)+1:n,1:(k)]=L21
    L[(k)+1:n,(k+1):n]=L22

    U[1:(k),1:(k)]=U11
    U[1:(k),(k+1):n]=U12
    U[(k+1):n,1:(k)]=U21
    U[(k+1):n,(k+1):n]=U22
    return L,U 
end`

这会遇到 ArgumentError: invalid index: 1.0 of type Float64 当我尝试计算矩阵的函数时。我真的很感激未来的任何提示以及如何解决这个问题。我猜我正在使用错误的变量类型,但 Julia 并没有让你知道问题到底出在哪里。 非常感谢。

【问题讨论】:

    标签: julia linear-algebra


    【解决方案1】:

    错误是因为你尝试用浮点数索引数组,例如:

    julia> x = [1, 2, 3]; x[1.0]
    ERROR: ArgumentError: invalid index: 1.0 of type Float64
    

    看起来它起源于这两行:

    k=n/2
    convert(Int, k)
    

    应该是这样的

    k=n/2
    k = convert(Int, k)
    

    您也可以直接使用整数除法:

    k = div(n, 2) # or n ÷ 2
    

    这将返回一个Int,您可以使用它进行索引。

    【讨论】:

    • 谢谢,我认为这行得通,我假设 convert() 工作正常。我现在遇到 MethodError: no method matching setindex_shape_check(::Int64, ::Int64, ::Int64) 你知道这是怎么回事吗?非常感谢!
    • 错误来自类似:x = [1, 2, 3]; x[1:2] = 1,您需要使用广播:x = [1, 2, 3]; x[1:2] .= 1(注意.)将标量分配给x 数组中的多个索引。我猜它来自所有看起来像 L[1:(k),1:(k)]=L11 的行。
    猜你喜欢
    • 2013-01-12
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2014-07-06
    相关资源
    最近更新 更多