如果数组为空,Julia 中的 sum 函数会出错
sum function in Julia is giving error if the array is empty
我正在尝试创建一个代码来识别数组中的元素是否是单调的。
我写了下面的代码并得到了错误-
function isMonotonic(array)
if length(array) <= 2
return true
end
check_up = []
check_down = []
for i in range(2, length(array))
if array[i] <= array[i-1]
append!(check_up, 1)
end
if array[i] >= array[i - 1]
append!(check_down, 1)
end
end
if sum(check_up) == length(array) - 1 || sum(check_down) == length(array) - 1
return true
else
return false
end
end
isMonotonic([1, 2, 3, 4, 5, 6 , 7])
我收到以下错误
Error: Methoderror: no method matching zero(::Type{Any})
我认为是因为我正在尝试总结empth数组,我想了解一般如何克服这个问题,我有上面代码的解决方案,但一般我想知道原因以及如何使用它。我不想先检查数组是否为空,然后再求和。
如果您想节省很多精力,最简单的解决方案就是:
my_ismonotonic(x) = issorted(x) || issorted(x ; rev=true)
如果 x
正向或反向排序,这将 return true
,否则 false
。
我们也许可以使用支票提高效率,因此我们只需要调用一次 issorted
。
function my_ismonotonic(x)
length(x) <= 2 && return true
for n = 2:length(x)
if x[n] > x[1]
return issorted(x)
elseif x[n] < x[1]
return issorted(x ; rev=true)
end
end
return true
end
# Alternatively, a neater version using findfirst
function my_ismonotonic(x)
length(x) <= 2 && return true
ii = findfirst(a -> a != x[1], x)
isnothing(ii) && return true # All elements in x are equal
if x[ii] > x[1]
return issorted(x)
else
return issorted(x ; rev=true)
end
end
循环检测第一次出现大于或小于第一个元素的元素,然后在这种情况发生时立即调用适当的 issorted
。如果数组中的所有元素都相等,则循环遍历整个数组并且 returns true
.
您的方法存在一些效率问题,但您收到实际错误消息的原因是因为给定输入,此表达式 sum(check_up)
或此表达式 sum(check_down)
将有效导致以下调用:
sum(Any[])
没有明显的 return 值,因为数组可以有任何类型,所以你会得到一个错误。如果您之前在函数中使用了以下内容:
check_up = Int[]
check_down = Int[]
那么你应该不会遇到同样的问题,因为:
julia> sum(Int[])
0
另请注意,append!
通常用于将矢量附加到矢量。如果您只想将单个元素添加到向量中,请使用 push!
.
我正在尝试创建一个代码来识别数组中的元素是否是单调的。
我写了下面的代码并得到了错误-
function isMonotonic(array)
if length(array) <= 2
return true
end
check_up = []
check_down = []
for i in range(2, length(array))
if array[i] <= array[i-1]
append!(check_up, 1)
end
if array[i] >= array[i - 1]
append!(check_down, 1)
end
end
if sum(check_up) == length(array) - 1 || sum(check_down) == length(array) - 1
return true
else
return false
end
end
isMonotonic([1, 2, 3, 4, 5, 6 , 7])
我收到以下错误
Error: Methoderror: no method matching zero(::Type{Any})
我认为是因为我正在尝试总结empth数组,我想了解一般如何克服这个问题,我有上面代码的解决方案,但一般我想知道原因以及如何使用它。我不想先检查数组是否为空,然后再求和。
如果您想节省很多精力,最简单的解决方案就是:
my_ismonotonic(x) = issorted(x) || issorted(x ; rev=true)
如果 x
正向或反向排序,这将 return true
,否则 false
。
我们也许可以使用支票提高效率,因此我们只需要调用一次 issorted
。
function my_ismonotonic(x)
length(x) <= 2 && return true
for n = 2:length(x)
if x[n] > x[1]
return issorted(x)
elseif x[n] < x[1]
return issorted(x ; rev=true)
end
end
return true
end
# Alternatively, a neater version using findfirst
function my_ismonotonic(x)
length(x) <= 2 && return true
ii = findfirst(a -> a != x[1], x)
isnothing(ii) && return true # All elements in x are equal
if x[ii] > x[1]
return issorted(x)
else
return issorted(x ; rev=true)
end
end
循环检测第一次出现大于或小于第一个元素的元素,然后在这种情况发生时立即调用适当的 issorted
。如果数组中的所有元素都相等,则循环遍历整个数组并且 returns true
.
您的方法存在一些效率问题,但您收到实际错误消息的原因是因为给定输入,此表达式 sum(check_up)
或此表达式 sum(check_down)
将有效导致以下调用:
sum(Any[])
没有明显的 return 值,因为数组可以有任何类型,所以你会得到一个错误。如果您之前在函数中使用了以下内容:
check_up = Int[]
check_down = Int[]
那么你应该不会遇到同样的问题,因为:
julia> sum(Int[])
0
另请注意,append!
通常用于将矢量附加到矢量。如果您只想将单个元素添加到向量中,请使用 push!
.