如何在两个for循环中使用break?

bit*_*ise 4 julia

我写了一个函数,它生成一个离散随机变量并返回两个索引。似乎我的代码是错误的,因为返回的第一个索引总是 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
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 5

在这种特殊情况下,因为可以将两个循环组合成一个多迭代器循环,如果您这样做,您可以打破它们:

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
Run Code Online (Sandbox Code Playgroud)

请注意,由于数组在 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
Run Code Online (Sandbox Code Playgroud)