在 Julia 的同心球体中取两个区间的数字
Take numbers form two intervals in concentric spheres in Julia
我正在尝试从 Julia 中的两个区间中获取数字。问题如下,
我正在尝试创建同心球体,我需要生成维度等于 15 的向量,其中填充了从每个圆圈中获取的数字。密码是:
rmax = 5
ra = fill(0.0,1,rmax)
for i=1:rmax-1
ra[:,i].=rad/i
ra[:,rmax].= 0
end
for i=1:3
ptset = Any[]
for j=1:200
yt= 0
yt= rand(Truncated(Normal(0, 1), -ra[i], ra[i] ))
if -ra[(i+1)] < yt <= -ra[i] || ra[(i+1)] <= yt < ra[i]
push!(ptset,yt)
if length(ptset) == 15
break
end
end
end
end
在这里,我试图生成每个球体内部都有统一的随机数;在这种情况下,yt
只是球内数字构造的一部分。
我想在半径为 r0
的球体中生成点(在本例中为 ra[:,4]
),然后点从第一个球体的边缘分布到第二个半径为 r1
(这里是ra[:,3]
)等等。
为了做到这一点,我尝试采用满足两个条件之一的元素 -ra[(i+1)] < yt <= -ra[i]
或 ra[(i+1)] <= yt < ra[i]
,即我想生成一个包含正数和负数的向量。我使用了运算符 ||
但它似乎只占了积极的部分。我是 Julia 的新手,我不确定如何从间隔的两个部分中获取元素。有没有人知道如何去做?提前致谢
希望我理解正确。首先,我们需要能够从半径为 r0
和 r1
:
的 N
维 shell 中均匀采样
using Random
using LinearAlgebra: normalize
struct Shell{N}
r0::Float64
r1::Float64
end
Base.eltype(::Type{<:Shell}) = Vector{Float64}
function Random.rand(rng::Random.AbstractRNG, d::Random.SamplerTrivial{Shell{N}}) where {N}
shell = d[]
Δ = shell.r1 - shell.r0
θ = normalize(randn(N)) # uniformly distributed N-dimensional direction of length 1
r = shell.r0 .* θ # scale to a point on the interior of the shell
return r .+ Δ .* θ .* .√rand(N) # add a uniformly random segment between r0 and r1
end
(有关挂接到 Random
的更多信息,请参阅 here。您同样可以实现一个新的 Distribution
,但这并不是真正必要的。)
最重要的是,截断法线不会导致均匀分布,但也不会在正确的方向上添加均匀缩放:请参阅 here 了解为什么需要平方根(我希望我明白了没错;你应该再检查一次数学)。
然后我们可以创建一系列 shell 个具有嵌套半径的样本:
rmax = 5
rad = 10.0
ra = range(0, rad, length=rmax)
ptset = [rand(Shell{2}(ra[i], ra[i+1]), 15) for i = 1:(rmax - 1)]
(这部分我不太确定,但重点应该很清楚。)
我正在尝试从 Julia 中的两个区间中获取数字。问题如下, 我正在尝试创建同心球体,我需要生成维度等于 15 的向量,其中填充了从每个圆圈中获取的数字。密码是:
rmax = 5
ra = fill(0.0,1,rmax)
for i=1:rmax-1
ra[:,i].=rad/i
ra[:,rmax].= 0
end
for i=1:3
ptset = Any[]
for j=1:200
yt= 0
yt= rand(Truncated(Normal(0, 1), -ra[i], ra[i] ))
if -ra[(i+1)] < yt <= -ra[i] || ra[(i+1)] <= yt < ra[i]
push!(ptset,yt)
if length(ptset) == 15
break
end
end
end
end
在这里,我试图生成每个球体内部都有统一的随机数;在这种情况下,yt
只是球内数字构造的一部分。
我想在半径为 r0
的球体中生成点(在本例中为 ra[:,4]
),然后点从第一个球体的边缘分布到第二个半径为 r1
(这里是ra[:,3]
)等等。
为了做到这一点,我尝试采用满足两个条件之一的元素 -ra[(i+1)] < yt <= -ra[i]
或 ra[(i+1)] <= yt < ra[i]
,即我想生成一个包含正数和负数的向量。我使用了运算符 ||
但它似乎只占了积极的部分。我是 Julia 的新手,我不确定如何从间隔的两个部分中获取元素。有没有人知道如何去做?提前致谢
希望我理解正确。首先,我们需要能够从半径为 r0
和 r1
:
N
维 shell 中均匀采样
using Random
using LinearAlgebra: normalize
struct Shell{N}
r0::Float64
r1::Float64
end
Base.eltype(::Type{<:Shell}) = Vector{Float64}
function Random.rand(rng::Random.AbstractRNG, d::Random.SamplerTrivial{Shell{N}}) where {N}
shell = d[]
Δ = shell.r1 - shell.r0
θ = normalize(randn(N)) # uniformly distributed N-dimensional direction of length 1
r = shell.r0 .* θ # scale to a point on the interior of the shell
return r .+ Δ .* θ .* .√rand(N) # add a uniformly random segment between r0 and r1
end
(有关挂接到 Random
的更多信息,请参阅 here。您同样可以实现一个新的 Distribution
,但这并不是真正必要的。)
最重要的是,截断法线不会导致均匀分布,但也不会在正确的方向上添加均匀缩放:请参阅 here 了解为什么需要平方根(我希望我明白了没错;你应该再检查一次数学)。
然后我们可以创建一系列 shell 个具有嵌套半径的样本:
rmax = 5
rad = 10.0
ra = range(0, rad, length=rmax)
ptset = [rand(Shell{2}(ra[i], ra[i+1]), 15) for i = 1:(rmax - 1)]
(这部分我不太确定,但重点应该很清楚。)