在 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
我是 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