我想在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
答案 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
作为哨兵值,而应使用NaN
或missing
。
您可以使用的另一种选择是将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,并建议您避免一开始就触发错误。