私はJuliaにいくつかの特別に定義された配列を持っています。これは多くの配列の単なる構成であると考えることができます。たとえば、次のように`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)]
私が持っている1つの警告:
今getindex(c::CompositeArray,i::Int...) = c.x[i...]
イテレータこれらのことが可能通じ:高いインデックス方式はちょうどx
自体に行きますx
のイテレータのチェーンとして簡単に作成し、次にy
を作成します。これは、値を反復することで、ほとんど追加コストがかからなくなります。しかし、反復のために何か同様のことをsetindex!
にすることはできますか?
私はy
対ちょうどインデックスx
ためCartesianIndex{2}
上の別々の発送とインデックスを持つことを考えて、どのようなCatViews.jl doesに似ているためeachindex
イテレータを、構築されました。しかし、私はそれがi...
ディスパッチとどのように相互作用するか、またはこの場合に役立つかどうかはわかりません。
さらに、ブロードキャストは、eachindex
上に構築されている場合、この高速反復スキームを自動的に使用しますか?
編集:
実場合length(c::CompositeArray) = length(c.x) + length(c.y)
、x
ができる任意AbstractArray
(従って、線形インデックスを有する)が、唯一のため線形インデックスは、一人のユーザに面するgetindex
機能を除いて(使用され)、問題は実際にベクトルをx
でこれを行う方法を見つけることに本当に沸騰します。
'length(c)'の定義は自然なものですが、 'i> length(c.x)+ length(c.y)'のときに 'getindex(c、i)'を実行するとどうなりますか?さらに、 'c.x [i ...]'は奇妙です。なぜなら、 'c.x'は次元1のベクトルですからです。あなたは質問をより明確にすることができますか? –
ああ、インデックス作成にエラーがありました。一定。 –