Julia 朱莉娅:交换会产生错误

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

我用的是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), 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上有几个帖子在讨论为什么这是个好主意)。对于这个问题,我并不清楚否决投票的原因。我投票支持零。