迭代`setindex!`

Chr*_*kas 3 arrays iterator julia

我在Julia中有一些特殊定义的数组,你可以认为它只是许多数组的组合.例如:

type CompositeArray{T}
  x::Vector{T}
  y::Vector{T}
end
Run Code Online (Sandbox Code Playgroud)

使用索引方案

getindex(c::CompositeArray,i::Int) = i <= length(c) ? c.x[i] : c.y[i-length(c.x)]
Run Code Online (Sandbox Code Playgroud)

我有一点需要注意:更高的索引方案就是这样x:

getindex(c::CompositeArray,i::Int...) = c.x[i...]
Run Code Online (Sandbox Code Playgroud)

现在,通过它们的迭代器可以很容易地作为迭代器的链x然后再打开y.这使得迭代值几乎不需要额外的成本.但是,可以为迭代做类似的事情setindex!吗?

我正在考虑单独调度CartesianIndex{2}索引xvs y和索引,并eachindex为其构建迭代器,类似于CatViews.jl.但是,我不确定它将如何与i...发送进行交互,或者在这种情况下是否有用.

此外,如果内置广播,广播会自动使用这种快速迭代方案eachindex吗?

编辑:

length(c::CompositeArray) = length(c.x) + length(c.y)
Run Code Online (Sandbox Code Playgroud)

在现实情况下,x可以是任何AbstractArray(因而具有线性指数),但由于只使用(除了一个面向用户的线性索引getindex功能),真正的问题归结为找出如何使用做x一个向量.

Mat*_* B. 7

做出X[CartesianIndex(2,1)]与众不同的意思X[2,1]肯定不会结束.我期望从这样一个事实相似的麻烦X[100,1]可能意味着什么不同X[100],或者length(X) != prod(size(X)).您可以自由地违反规则,但是当Base和其他软件包中的函数希望您遵循它们时,您不应该感到惊讶.

执行此操作的安全方法是在eachindex(::CompositeArray)完全控制的对象上返回自定义迭代器.也许只是抛出一个包装器并转发方法CartesianRange,CartesianIndex{2}如果该数据结构是有用的.然后,当您获得这些自定义索引类型之一时,您知道SplitIndex(CartesianIndex(1,2))确实打算引用第二个数组中的第一个元素.