意思!可能 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
向量仅包含 0
s,因此稍后您也会获得所有 0
s。
然而,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
我最近有以下问题
关于 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
向量仅包含 0
s,因此稍后您也会获得所有 0
s。
然而,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