意思!可能 return 不正确的结果

mean! may return incorrect results

我最近有以下问题 关于 Statistics.jl 包的功能 mean!

报告了以下关于 mean! 行为的错误。如前所述,mean! 函数没有正确地考虑到它的参数可能彼此互为别名。在某些情况下,mean! 的结果不正确:

julia> let a = [1 2 3]
       mean!(a, a)
   end
1×3 Array{Int64,2}:
0  0  0

julia> let a = [1 2 3]
       mean!(copy(a), a)
   end
1×3 Array{Int64,2}:
1  2  3

julia> versioninfo()
Julia Version 1.5.3
Commit 788b2c77c1 (2020-11-09 13:37 UTC)
Platform Info:
 OS: macOS (x86_64-apple-darwin18.7.0)
 CPU: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
 WORD_SIZE: 64
 LIBM: libopenlibm
 LLVM: libLLVM-9.0.1 (ORCJIT, skylake)

但是,我认为这种行为是正常的,因为查看mean!的定义,操作mean!(r, v)的结果写在r中。因此对我来说,如果您使用相同的对象作为变量 r 和变量 v,结果是不可预测的。

我发现 sum! 函数也会发生这种情况。

谁能告诉我我说的对不对,有什么我不明白的地方。

mean! 的行为与您观察到的一样,因为它在内部调用 sum!.

现在 sum! 之所以如此,原因如下。它旨在执行求和而不进行任何分配。因此 sum! 做的第一件事是将目标向量初始化为 0(求和的中性元素)。完成此操作后,您的 a 向量仅包含 0s,因此稍后您也会获得所有 0s。

然而,sum!(和类似的)函数文档字符串应该提到目标不应该与源别名确实是有意义的。这是您观察到的另一个例子:

julia> x = [1 2 3
            4 5 6
            7 8 9]
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> y = view(x, :, 1)
3-element view(::Matrix{Int64}, :, 1) with eltype Int64:
 1
 4
 7

julia> sum!(y, x)
3-element view(::Matrix{Int64}, :, 1) with eltype Int64:
  5
 11
 17

julia> x
3×3 Matrix{Int64}:
  5  2  3
 11  5  6
 17  8  9