gpt4 book ai didi

arrays - 一次访问数组的一些元素并环绕到开头

转载 作者:行者123 更新时间:2023-12-04 10:03:17 27 4
gpt4 key购买 nike

我有一个简单的问题,应该有一个简单的答案,但我还想不出来。我想处理一个数组,一次处理一定数量的元素,然后循环到开头。

这是显示何时 n 的图表是 10,每次都需要三个元素:

iterations 3 at a time

到目前为止,我尝试编写一个简单的迭代失败了:使用 % n给我零,这不适用于 Julia 的单索引... :)

最佳答案

mod1提供功能以允许您想要的行为:

julia> mod1(1, 5)
1

julia> mod1(3, 5)
3

julia> mod1(5, 5)
5

julia> mod1(6, 5)
1

制作一个 mod-indexed 函数非常简单:
modindex(A, i) = A[mod1(i, length(A))]

甚至你自己的 mod-indexed 数组类型:
julia> immutable CircArray{T} <: AbstractArray{T,1}
xs::Vector{T}
end

julia> Base.size(x::CircArray) = (length(x.xs),)

julia> Base.getindex(x::CircArray, i) = x.xs[mod1(i, length(x.xs))]

julia> A = CircArray([1:2:10;])
CircArray{Array{Int64,1}}([1,3,5,7,9])

julia> A[0]
9

julia> A[5]
9

julia> A[7]
3

在此之上实现切片并不太难。正如 DNF 在评论中提到的,一个干净简洁的解决方案是
modindex(A, i) = A[mod1.(i, end)]

或等效于 getindex ,它处理标量索引和切片。

编辑:由于您的问题提到了迭代,我想我会提供一个更通用的解决方案,该解决方案也适用于非数组以进行迭代,仅使用 Base 中的功能迭代:
julia> threes(A) = let cy = cycle(A)
take(zip(cy, drop(cy, 1), drop(cy, 2)), length(A))
end
threes (generic function with 1 method)

julia> for (a, b, c) in threes([1, 2, 3, 4, 5])
println(a, b, c)
end
123
234
345
451
512

关于arrays - 一次访问数组的一些元素并环绕到开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com