如何跳过Julia循环中的错误

时间:2019-09-16 23:30:10

标签: julia

我想在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

2 个答案:

答案 0 :(得分: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

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

您可以使用的另一种选择是将vec提升为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

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

答案 1 :(得分:4)

使用try / 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

我认为这只是一个玩具示例。我将重申Julia's style guide,并建议您避免一开始就触发错误。