我写了一个函数,它生成一个离散随机变量并返回两个索引。似乎我的代码是错误的,因为返回的第一个索引总是 4。这是我的代码:
function inds(arr::Array{Float64, 2})
probs = arr/sum(arr)
u = rand()
sum_prob = 0.0
local ii, jj
for i=1:size(arr)[1]
for j=1:size(arr)[2]
if sum_prob <= u < sum_prob + probs[i,j]
ii = i
jj = j
break
else
sum_prob += probs[i,j]
end
end
end
return (ii, jj, probs[ii,jj])
end
最佳答案
在这种特殊情况下,因为可以将两个循环组合成一个多迭代器循环,如果您这样做,您可以打破它们:
function inds(arr::Array{Float64, 2})
probs = arr/sum(arr)
u = rand()
sum_prob = 0.0
local ii, jj
for i=1:size(arr,1), j=1:size(arr,2)
if sum_prob <= u < sum_prob + probs[i,j]
ii = i
jj = j
break
else
sum_prob += probs[i,j]
end
end
return (ii, jj, probs[ii,jj])
end
请注意,由于数组在 Julia 中是列优先的——就像 Fortran 和 Matlab,但与 C 不同——它可能更快地切换循环顺序,如下所示:
function inds(arr::Array{Float64, 2})
probs = arr/sum(arr)
u = rand()
sum_prob = 0.0
local ii, jj
for j=1:size(arr,2), i=1:size(arr,1)
if sum_prob <= u < sum_prob + probs[i,j]
ii = i
jj = j
break
else
sum_prob += probs[i,j]
end
end
return (ii, jj, probs[ii,jj])
end
关于julia - 如何在两个for循环中使用break?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59738480/