我最近有以下关于mean!该Statistics.jl包的功能的问题。
报告了有关 的行为的以下错误mean!。如前所述,该mean!函数没有正确考虑其参数可能相互别名。在某些此类情况下,结果mean!不正确:
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)\nRun Code Online (Sandbox Code Playgroud)\n但是,我认为这种行为是正常的,因为查看 的定义mean!,操作的结果mean!(r, v)被写入 中r。因此,对我来说,如果您使用相同的对象作为变量r和变量v,结果是不可预测的,这似乎是合乎逻辑的。
我发现该sum!函数也会发生这种情况。
有人可以告诉我我是否正确,或者确实有一些我不明白的地方。
\nmean!其行为方式与您观察到的方式相同,因为它内部调用sum!.
现在sum!这样做的原因如下。它旨在执行求和而不进行任何分配。因此,首先sum!要做的就是将目标向量初始化为0(求和的中性元素)。完成此操作后,您的a向量仅包含0s,因此稍后您也会获得所有0s。
然而,sum!(和类似的)函数文档字符串应该提到目标不应与源别名,这确实是有意义的。这是您观察到的另一个例子:
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\nRun Code Online (Sandbox Code Playgroud)\n