Julia 朱莉娅:交换会产生错误
我用的是Julia 0.3.4 我正在尝试使用高斯消去法编写LU分解。所以我必须交换行。我的问题是: 如果我使用的是Julia 朱莉娅:交换会产生错误,julia,Julia,我用的是Julia 0.3.4 我正在尝试使用高斯消去法编写LU分解。所以我必须交换行。我的问题是: 如果我使用的是a,b=b,a我会得到一个错误 但如果我正在使用: function swapRows(row1, row2) temp = row1 row1 = row2 row2 = temp end 然后一切正常 我是做错了什么还是这是一个错误 以下是我的源代码: function lu_t(A::Matrix) # input value: (A), whe
a,b=b,a
我会得到一个错误
但如果我正在使用:
function swapRows(row1, row2)
temp = row1
row1 = row2
row2 = temp
end
然后一切正常
我是做错了什么还是这是一个错误
以下是我的源代码:
function lu_t(A::Matrix)
# input value: (A), where A is a matrix
# return value: (L,U), where L,U are matrices
function swapRows(row1, row2)
temp = row1
row1 = row2
row2 = temp
return null
end
if size(A)[1] != size(A)[2]
throw(DimException())
end
n = size(A)[1] # matrix dimension
U = copy(A) # upper triangular matrix
L = eye(n) # lower triangular matrix
for k = 1:n-1 # direct Gaussian elimination for each column `k`
(val,id) = findmax(U[k:end,k]) # find max pivot element and it's row `id`
if val == 0 # check matrix for singularity
throw(SingularException())
end
swapRows(U[k,k:end],U[id,k:end]) # swap row `k` and `id`
# U[k,k:end],U[id,k:end] = U[id,k:end],U[k,k:end] - error
for i = k+1:n # for each row `i` > `k`
μ = U[i,k] / U[k,k] # find elimination coefficient `μ`
L[i,k] = μ # save to an appropriate position in lower triangular matrix `L`
for j = k:n # update each value of the row `i`
U[i,j] = U[i,j] - μ⋅U[k,j]
end
end
end
return (L,U)
end
###### main code ######
A = rand(4,4)
@time (L,U) = lu_t(A)
@test_approx_eq(L*U, A)
swapRows
函数是一个不可操作的函数,没有任何效果–它所做的只是围绕一些局部变量名进行交换。请参阅关于赋值和变异之间差异的各种讨论:
null
并不意味着你认为它是什么——在Julia v0.3中,它是一个计算线性变换的零空间的函数;在Julia v0.4中,它仍然意味着这一点,但已被弃用并重命名为nullspace
。Julia中的“无趣”值称为nothing
我不确定注释掉的行交换代码有什么问题,但这种通用方法确实有效:
julia> X = rand(3,4)
3x4 Array{Float64,2}:
0.149066 0.706264 0.983477 0.203822
0.478816 0.0901912 0.810107 0.675179
0.73195 0.756805 0.345936 0.821917
julia> X[1,:], X[2,:] = X[2,:], X[1,:]
(
1x4 Array{Float64,2}:
0.478816 0.0901912 0.810107 0.675179,
1x4 Array{Float64,2}:
0.149066 0.706264 0.983477 0.203822)
julia> X
3x4 Array{Float64,2}:
0.478816 0.0901912 0.810107 0.675179
0.149066 0.706264 0.983477 0.203822
0.73195 0.756805 0.345936 0.821917
由于这会创建一对临时数组,我们还无法消除其分配,因此这不是最有效的方法。如果您希望这里的代码效率最高,则在两行上循环并交换标量值对将更快:
function swapRows!(X, i, j)
for k = 1:size(X,2)
X[i,k], X[j,k] = X[j,k], X[i,k]
end
end
请注意,在Julia中,命名函数是一种常规做法,这些函数使用尾随的来改变一个或多个参数代码>。目前,闭包(即内部函数)存在一些性能问题,因此您希望在顶级作用域中定义此类辅助函数,而不是在另一个函数中定义
最后,我假设这是一个练习,因为Julia附带了经过仔细调优的泛型(即,它适用于任意数字类型)LU分解:
-
swapRows
函数是一个不可操作的函数,没有任何效果–它所做的只是围绕一些局部变量名进行交换。请参阅关于赋值和变异之间差异的各种讨论:
null
并不意味着你认为它是什么——在Julia v0.3中,它是一个计算线性变换的零空间的函数;在Julia v0.4中,它仍然意味着这一点,但已被弃用并重命名为nullspace
。Julia中的“无趣”值称为nothing
我不确定注释掉的行交换代码有什么问题,但这种通用方法确实有效:
julia> X = rand(3,4)
3x4 Array{Float64,2}:
0.149066 0.706264 0.983477 0.203822
0.478816 0.0901912 0.810107 0.675179
0.73195 0.756805 0.345936 0.821917
julia> X[1,:], X[2,:] = X[2,:], X[1,:]
(
1x4 Array{Float64,2}:
0.478816 0.0901912 0.810107 0.675179,
1x4 Array{Float64,2}:
0.149066 0.706264 0.983477 0.203822)
julia> X
3x4 Array{Float64,2}:
0.478816 0.0901912 0.810107 0.675179
0.149066 0.706264 0.983477 0.203822
0.73195 0.756805 0.345936 0.821917
由于这会创建一对临时数组,我们还无法消除其分配,因此这不是最有效的方法。如果您希望这里的代码效率最高,则在两行上循环并交换标量值对将更快:
function swapRows!(X, i, j)
for k = 1:size(X,2)
X[i,k], X[j,k] = X[j,k], X[i,k]
end
end
请注意,在Julia中,命名函数是一种常规做法,这些函数使用尾随的来改变一个或多个参数代码>。目前,闭包(即内部函数)存在一些性能问题,因此您希望在顶级作用域中定义此类辅助函数,而不是在另一个函数中定义
最后,我假设这是一个练习,因为Julia附带了经过仔细调优的泛型(即,它适用于任意数字类型)LU分解:
-
这很简单
julia> A = rand(3,4)
3×4 Array{Float64,2}:
0.241426 0.283391 0.201864 0.116797
0.457109 0.138233 0.346372 0.458742
0.0940065 0.358259 0.260923 0.578814
julia> A[[1,2],:] = A[[2,1],:]
2×4 Array{Float64,2}:
0.457109 0.138233 0.346372 0.458742
0.241426 0.283391 0.201864 0.116797
julia> A
3×4 Array{Float64,2}:
0.457109 0.138233 0.346372 0.458742
0.241426 0.283391 0.201864 0.116797
0.0940065 0.358259 0.260923 0.578814
这很简单
julia> A = rand(3,4)
3×4 Array{Float64,2}:
0.241426 0.283391 0.201864 0.116797
0.457109 0.138233 0.346372 0.458742
0.0940065 0.358259 0.260923 0.578814
julia> A[[1,2],:] = A[[2,1],:]
2×4 Array{Float64,2}:
0.457109 0.138233 0.346372 0.458742
0.241426 0.283391 0.201864 0.116797
julia> A
3×4 Array{Float64,2}:
0.457109 0.138233 0.346372 0.458742
0.241426 0.283391 0.201864 0.116797
0.0940065 0.358259 0.260923 0.578814
请投反对票的选民留下评论,说明投反对票的原因(meta上有几个帖子讨论了为什么这是个好主意)。对于这个问题,我并不清楚否决投票的原因。我的投票结果又回到了零。请那些投反对票的选民留下一条评论,说明投反对票的原因(meta上有几个帖子在讨论为什么这是个好主意)。对于这个问题,我并不清楚否决投票的原因。我投票支持零。