朱莉娅:如何得到一个二维数组的第一个元素,这些元素比向量的元素还多



我有一个定义如下的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