如何跳过Julia循环中的错误

Miz*_*zle 4 julia

我想跳过茱莉亚循环中的错误。示例如下。我想计算向量中每个元素的平方根。由于sqrt(-16)是一个复杂值,Julia将报告错误并停止循环。我希望julia在循环中有错误时继续循环。我正在寻找的输出是结果= [1、2、3、99999、5、6],其中99999表示存在错误。

vec = [1,4,9,-16,25,36]
result = zeros(6)
for i = 1:6
  result[i] = sqrt(vec[i])
end

Run Code Online (Sandbox Code Playgroud)

Dav*_*ela 6

A try/catch将拦截错误。在catch块内,您​​可以丢弃错误并返回标记值:

vec = [1,4,9,-16,25,36]
result = zeros(6)
for i = 1:6
    result[i] = try
        sqrt(vec[i])
    catch
        999999
    end
end
Run Code Online (Sandbox Code Playgroud)

我认为这是一个玩具示例。我将重申Julia 的风格指南:首先最好避免错误。


Mas*_*son 6

除了本问题实质中使用的其他答案外try / catch,您还有其他选择。最好的方法可能是:

function mysqrt(x)
    if x < 0
        999999.0
    else
        sqrt(x)
    end
end

vec = [1,4,9,-16,25,36]

julia> mysqrt.(vec)
6-element Array{Float64,1}:
      1.0
      2.0
      3.0
 999999.0
      5.0
      6.0
Run Code Online (Sandbox Code Playgroud)

尽管我强烈建议您不要将其999999.0用作哨兵值,而应使用NaNmissing

您可以选择的另一种选择是将其提升vec为a,Vector{Complex}以免遇到域错误,但这会降低性能。看起来像

julia> sqrt.(complex(vec))
6-element Array{Complex{Float64},1}:
 1.0 + 0.0im
 2.0 + 0.0im
 3.0 + 0.0im
 0.0 + 4.0im
 5.0 + 0.0im
 6.0 + 0.0im
Run Code Online (Sandbox Code Playgroud)

然后您可以根据需要按实部和虚部过滤向量。