在julia
中通過for循環循環時獲取兩個相鄰元素的快速方法是什麼?Julia - 在for循環中訪問兩個元素
假設我有
z = linspace(1, 10, 9)
for i in z[1:length(z)-1]
println(i, " ")
end
我可以以某種方式得到這兩個元素i
和下一個i+1
?
在julia
中通過for循環循環時獲取兩個相鄰元素的快速方法是什麼?Julia - 在for循環中訪問兩個元素
假設我有
z = linspace(1, 10, 9)
for i in z[1:length(z)-1]
println(i, " ")
end
我可以以某種方式得到這兩個元素i
和下一個i+1
?
是的,這是可能的。由於它很常見,所以在Iterators.jl
中定義了一個特殊的迭代器來處理這種類型的任務。其他特殊的迭代器也非常有用(從個人經驗),值得研究。
using Iterators # may have to Pkg.add("Iterators") first
z = linspace(1,10,9)
for (v1,v2) in partition(z,2,1)
@show v1,v2
end
的參數的partition
2,1
是大小和所述元組的步驟。
參考朱莉婭Doc,一般for
環路朱莉婭:
for i = I # or "for i in I"
# body
end
被翻譯成while
結構:
state = start(I)
while !done(I, state)
(i, state) = next(I, state)
# body
end
因此,使用相同的語法,一個可以簡單地實現定製&高效循環,例如下面的一個,在每次迭代中提取兩個相鄰的元素:
I=linspace(1, 10, 9)
state = start(I)
while !done(I, state)
(i, state) = next(I, state) #
(j, _) = next(I, state) # extract next element without update state
println(i,' ',j)
end
#= >
1.0 2.125
2.125 3.25
3.25 4.375
4.375 5.5
5.5 6.625
6.625 7.75
7.75 8.875
8.875 10.0
10.0 11.125
< =#
我很喜歡reduce()
:
julia> z = linspace(1, 10, 10);
julia> reduce((x, y) -> (println("$x + $y = $(x+y)"); y), z)
1.0 + 2.0 = 3.0
2.0 + 3.0 = 5.0
3.0 + 4.0 = 7.0
4.0 + 5.0 = 9.0
5.0 + 6.0 = 11.0
6.0 + 7.0 = 13.0
7.0 + 8.0 = 15.0
8.0 + 9.0 = 17.0
9.0 + 10.0 = 19.0
10.0
的想法是對的功能背後的第二個值留下,以便它可以被用作下一對的第一個值。
你可以倒着走,如果你使用foldr()
,返回的第一個值:
julia> foldr((x, y) -> (println("$x + $y = $(x+y)"); x), z)
9.0 + 10.0 = 19.0
8.0 + 9.0 = 17.0
7.0 + 8.0 = 15.0
6.0 + 7.0 = 13.0
5.0 + 6.0 = 11.0
4.0 + 5.0 = 9.0
3.0 + 4.0 = 7.0
2.0 + 3.0 = 5.0
1.0 + 2.0 = 3.0
1.0
BTW的StackOverflow剛纔問我傳遞一個CAPTCHA來證明我是人。坦率地說,如果機器人可以回答StackOverflow問題,那麼可能是時候把靴子掛好了。 –