在 Julia 中构建用于 LU 分解的递归函数
Building a recursion function for LU decomposition in Julia
我是 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> 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
这将 return 一个 Int
,您可以用它编制索引。
我是 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> 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
这将 return 一个 Int
,您可以用它编制索引。