意思是!可能会返回不正确的结果

Jos*_*tos 6 statistics julia

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

\n

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

\n
julia> let a = [1 2 3]\n       mean!(a, a)\n   end\n1\xc3\x973 Array{Int64,2}:\n0  0  0\n\njulia> let a = [1 2 3]\n       mean!(copy(a), a)\n   end\n1\xc3\x973 Array{Int64,2}:\n1  2  3\n\njulia> versioninfo()\nJulia Version 1.5.3\nCommit 788b2c77c1 (2020-11-09 13:37 UTC)\nPlatform Info:\n OS: macOS (x86_64-apple-darwin18.7.0)\n CPU: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz\n WORD_SIZE: 64\n LIBM: libopenlibm\n LLVM: libLLVM-9.0.1 (ORCJIT, skylake)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

有人可以告诉我我是否正确,或者确实有一些我不明白的地方。

\n

Bog*_*ski 6

mean!其行为方式与您观察到的方式相同,因为它内部调用sum!.

\n

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

\n

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

\n
julia> x = [1 2 3\n            4 5 6\n            7 8 9]\n3\xc3\x973 Matrix{Int64}:\n 1  2  3\n 4  5  6\n 7  8  9\n\njulia> y = view(x, :, 1)\n3-element view(::Matrix{Int64}, :, 1) with eltype Int64:\n 1\n 4\n 7\n\njulia> sum!(y, x)\n3-element view(::Matrix{Int64}, :, 1) with eltype Int64:\n  5\n 11\n 17\n\njulia> x\n3\xc3\x973 Matrix{Int64}:\n  5  2  3\n 11  5  6\n 17  8  9\n
Run Code Online (Sandbox Code Playgroud)\n

  • 外部参考 https://github.com/JuliaLang/julia/issues/39385 (3认同)