我有一个定义如下的2d数组:
> s = cumsum([0.1 0.2 0.3 0.4; 0.25 0.15 0.35 0.25; 0.3 0.3 0.3 0.1], dims=2)
3×4 Array{Float64,2}:
0.1 0.3 0.6 1.0
0.25 0.4 0.75 1.0
0.3 0.6 0.9 1.0
我定义了一个随机向量
> r = rand(3)
3-element Array{Float64,1}:
0.5560575798047342
0.4759478853774721
0.48545434824655853
我知道这行代码返回s的所有元素,这些元素比基于行比较的r的元素多
> s.*(r .< s)
3×4 Array{Float64,2}:
0.0 0.0 0.6 1.0
0.0 0.0 0.75 1.0
0.0 0.6 0.9 1.0
但我需要一个像这样的解决方案
3×4 Array{Float64,2}:
0.0 0.0 0.6 0.0
0.0 0.0 0.75 0.0
0.0 0.6 0.0 0.0
您可以考虑的两种方法是(我和您使用相同的r
(。
一个简单但有点冗长的:
julia> x = r .< s
3×4 BitArray{2}:
0 0 1 1
0 0 1 1
0 1 1 1
julia> s .* [x[i, j] - (j == 1 ? 0 : x[i, j - 1]) for i in axes(x, 1), j in axes(x, 2)]
3×4 Array{Float64,2}:
0.0 0.0 0.6 0.0
0.0 0.0 0.75 0.0
0.0 0.6 0.0 0.0
还有一个类似的东西稍微短一点:
julia> using ShiftedArrays
julia> x = r .< s
3×4 BitArray{2}:
0 0 1 1
0 0 1 1
0 1 1 1
julia> s .* coalesce.(x .- lag(x, (0, 1)), 0)
3×4 Array{Float64,2}:
0.0 0.0 0.6 0.0
0.0 0.0 0.75 0.0
0.0 0.6 0.0 0.0