在Julia中,“zero(eltype(x))”和“zero(x)”之间有什么区别?

5
在《Julia高性能》(第2版)一书中,作者给出了以下示例来解释如何在循环中获得类型稳定性:
function simdsum_fixed(x)
    s = zero(eltype(x))
    @simd for v in A
        s += v
    end
    return s
end

在之前的例子中,他们使用了不同的代码,只是简单地使用了 zero(x)。因此,我尝试了同样的函数,但没有使用 eltype() ,如下所示(simdsum_fixed_b)。它们似乎以相同的方式工作。
function simdsum_fixed_b(x)
    s = zero(x)
    @simd for v in A
        s += v
    end
    return s
end

那么,zero(eltype(x))zero(x)有什么区别呢?使用第一个的优点是什么?
谢谢。

1
你的函数在两种情况下表现相同的原因可能是你使用zero(x)进行初始化,但是迭代另一个变量A,该变量可能为全局变量。如果你修复这个错误,在输入向量x时,你的第二个例子应该会失败。 - DNF
1个回答

9

x表示容器(例如向量)并且您希望获得其元素的加法单位时,请使用zero(eltype(x))。当您想要获取x本身的加法单位时,请使用zero(x)

以下是以向量为例,因为这里最明显可以看出区别:

julia> x = [1, 2, 3]
3-element Vector{Int64}:
 1
 2
 3

julia> zero(x)
3-element Vector{Int64}:
 0
 0
 0

julia> zero(eltype(x))
0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接