在朱莉娅

时间:2020-06-25 15:28:55

标签: arrays if-statement julia intervals

我正在尝试从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])的球体内生成点,然后将点从第一个球的边缘分布到半径为{{1}的第二个球}(此处为r1)等等。

为此,我尝试采用满足两个条件之一的元素ra[:,3]-ra[(i+1)] < yt <= -ra[i],即我想生成一个带有正数和负数的向量。我使用了运算符 ra[(i+1)] <= yt < ra[i],但它似乎只发挥了积极作用。我是朱莉娅(Julia)的新手,我不确定如何从间隔的两个部分提取元素。有人在如何做上有成功吗?预先感谢

1 个答案:

答案 0 :(得分:1)

我希望我能正确理解你。首先,我们需要能够从半径为Nr0的{​​{1}}维壳中进行均匀采样:

r1

(有关钩入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 的更多信息,请参见here。您可以同样地实现一个新的Random,但这并不是必须的。)

最重要的是,截断的法线不会导致均匀的分布,但是也不会向正确的方向添加均匀的缩放比例:请参见here,了解为什么平方根是必需的(我希望我做对了;您应该再次检查数学。)

然后我们可以创建一个带有嵌套半径的壳样本序列:

Distribution

(我不太确定这部分,但是重点应该很清楚。)