在 Julia 中追加

Append in Julia

我是 Julia 的新手。 A 很好奇我如何附加值。每次布尔值为 True 时,我都希望 b 增长。然后输出它的大小。

function f(img_deformed, img)
    s = size(img)[1]
    for i in range(1,s,step=1)
        for j in range(1,s,step=1)
            b = img_deformed[i,j] == img[i,j]           
        end
    end
    return b
end

如果您希望 b 成为一个向量来跟踪满足 for 循环中的等式的次数,您可以使用 push!:

function f(img_deformed, img)
    s = size(img)[1]
    b = Vector{Bool}() # Can also use Bool[]
    for i in range(1,s,step=1)
        for j in range(1,s,step=1)
            if img_deformed[i,j] == img[i,j]
               push!(b, true)
            end           
        end
    end
    return length(b)
end

但是,如果您真正关心的是 true 的数量,那么使用 b 作为计数器更容易(而且几乎肯定更好):

function f(img_deformed, img)
    s = size(img)[1]
    b = 0
    for i in range(1,s,step=1)
        for j in range(1,s,step=1)
            if img_deformed[i,j] == img[i,j]
               b += 1
            end          
        end
    end
    return b
end

一些小的样式点:s = size(img)[1] 等同于 s = size(img, 1)range(1, s, step=1) 等同于 1:s,因此您的代码可以稍微简单地编写为

function f(img_deformed, img)
    s = size(img, 1)
    b = 0
    r = 1:s
    for i in r
        for j in r
            if img_deformed[i,j] == img[i,j]
               b += 1
            end          
        end
    end
    return b
end

但是,这并没有解决原始代码中的潜在错误:除非您知道 img 将始终是一个方阵,并且对 1:s 使用相同的范围 (1:s) =16=] 循环不保证是正确的。为避免此问题,您可以使用 axes:

function f(img_deformed, img)
    b = 0
    for j in axes(img, 2)
        for i in axes(img, 1)
            if img_deformed[i,j] == img[i,j]
               b += 1
            end          
        end
    end
    return b
end

注意这里我选择了先遍历列;这在 Julia 中是一个很好的做法,因为数组以 column-major 顺序存储(请参阅手册中的解释 here)。

另请注意,使用 img 来控制我们循环的值隐含地假定 size(img) == size(img_deformed)。在不知道更多关于这个函数的用途的情况下,很难建议如何处理它,但是如果你可以假设两个矩阵 应该 大小相同,你可以添加一个检查 f() 的顶部,例如

function f(img_deformed, img)
   @assert size(img) == size(img_deformed)
   # rest of code is the same
end