我想以循环方式访问数组中的元素。通常,取模就足够了,但是在Julia数组中,从1开始。目前,我基本上是将索引转换为基于0的索引,然后再转换回来。但这不适用于负索引。
A = 1:5
for i in -6:6
println(i, " -> ", ((i - 1) % length(A)) + 1)
end
输出
-6 -> -1 # wrong
-5 -> 0 # wrong
-4 -> 1 # wrong
-3 -> -3 # wrong
-2 -> -2 # wrong
-1 -> -1 # wrong
0 -> 0 # wrong
1 -> 1
2 -> 2
3 -> 3
4 -> 4
5 -> 5
6 -> 1
答案 0 :(得分:8)
我通常为此使用mod1
函数。这是一个示例:
julia> [-10:10 mod1.(-10:10, 5)]
21×2 Array{Int64,2}:
-10 5
-9 1
-8 2
-7 3
-6 4
-5 5
-4 1
-3 2
-2 3
-1 4
0 5
1 1
2 2
3 3
4 4
5 5
6 1
7 2
8 3
9 4
10 5
答案 1 :(得分:2)
您怀疑%
运算符不是mod
运算符,而是rem
运算符。
用mod( i-1, length(A) )
替换模运算,您将获得预期的结果。
PS。我将不得不补充,这种循环的用例也很重要。如果您要复制类似python的负索引,其中负索引-1索引数组的最后一个元素,并从该点开始以这种方式循环循环以获取负数,则必须对0进行不同的处理和两个不同的分支,一个代表正数,一个代表负数。