У меня есть несколько специально определенных массивов в Джулии, которые вы можете считать просто композицией многих массивов. Например:
type CompositeArray{T}
x::Vector{T}
y::Vector{T}
end
со схемой индексации
getindex(c::CompositeArray,i::Int) = i <= length(c) ? c.x[i] : c.y[i-length(c.x)]
У меня есть одно предостережение: более высокая схема индексации просто переходит к самому x
:
getindex(c::CompositeArray,i::Int...) = c.x[i...]
Теперь итератор через них можно легко сделать как цепочку итератора на x
и затем на y
. Это делает перебор значений почти без дополнительных затрат. Однако можно ли сделать что-то подобное для итерации до setindex!
?
Я думал о том, чтобы создать отдельную диспетчеризацию для CartesianIndex{2}
только для индексации x
против y
и индекса, и создать для этого итератор eachindex
, аналогичный тому, что CatViews.jl делает. Однако я не уверен, как это будет взаимодействовать с отправкой i...
и будет ли это полезно в данном случае.
Кроме того, будет ли вещание автоматически использовать эту схему быстрой итерации, если оно построено на eachindex
?
Редактирует:
length(c::CompositeArray) = length(c.x) + length(c.y)
В реальном случае x
может быть любым AbstractArray
(и, следовательно, имеет линейный индекс), но поскольку используется только линейная индексация (за исключением этой одной пользовательской функции getindex
), проблема на самом деле сводится к выяснению того, как это сделать. это с x
вектором.
getindex
для этого типа и использование его вeachindex
? Похоже, это сработает. 14.02.2017