У меня есть некоторые специально определенные массивы в Юлии, которые вы можете представить как просто состав многих массивов. Например:Итерация для `setindex!`
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 does. Однако я не уверен, как это будет взаимодействовать с отправкой i...
или будет ли это полезно в этом случае.
Кроме того, будет ли широковещательная передача автоматически использовать эту быструю схему итерации, если она построена на eachindex
?
изменения:
length(c::CompositeArray) = length(c.x) + length(c.y)
В реальном случае, x
может быть любой AbstractArray
(и, таким образом, имеет линейный индекс), но так как используется только линейная индексация (для этого одного пользователя обращенных getindex
функции, за исключением), проблема действительно сводится к выяснению, как это сделать с помощью x
a Vector.
Каково определение 'length (c)' и задано естественное, что происходит, когда вы 'getindex (c, i)' когда 'i> length (c.x) + length (c.y)'? Кроме того, 'c.x [i ...]' является странным, поскольку 'c.x' является вектором i.e измерения 1. Вы можете сделать вопрос более ясным. –
О, была ошибка в индексировании. Исправлена. –