Построение рекурсивной функции для разложения LU в Юлии - PullRequest
0 голосов
/ 06 ноября 2018

Я очень плохо знаком с Джулией и пытался найти и устранить неполадки в коде, который я написал для рекурсивной декомпозиции 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: недопустимый индекс: 1.0 типа Float64 , когда я пытаюсь вычислить функцию для матрицы. Я был бы очень признателен за любые советы на будущее, а также как решить эту проблему. Я предполагаю, что в какой-то момент я работаю с неверным типом переменной, но Джулия не дает вам знать, где именно проблема. Большое спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Ошибка в том, что вы пытаетесь индексировать массив с помощью числа с плавающей запятой, например:

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, который можно проиндексировать.

...