(自動微分の中で使う用の)
— ジョンお兄さん改 (@YoSayTouchGot) March 8, 2023
index操作を使わずに、ある長さのベクトル(その都度長さは変わるが最長値は決まっている)を後ろにゼロベクトルをくっつけて最長値の長さのベクトルに変換するのってどうするのが良いんでしょう?
配列をラップして、 getindex(A, i)
関数(A[i]
のこと)を置き換える。
実質的には分岐を他の場所に書いているだけだが、コードが見やすくなる。
また、 AbstractVector
のサブタイプにすることにより、そのまま演算に使用できる。
自動微分に対応しているかは確認していない。独自型に対して自動微分している例はある。
あくまで一案として見てほしい。
struct ZeroPaddedVector{T, V <: AbstractVector{T}} <: AbstractVector{T}
vec :: V
len :: Int
end
# https://docs.julialang.org/en/v1/manual/interfaces/#man-interface-array
Base.size(p::ZeroPaddedVector) = (p.len, )
Base.getindex(p::ZeroPaddedVector, i::Int) = checkbounds(Bool, p.vec, i) ? p.vec[i] : zero(eltype(p))
ZeroPaddedVector(rand(7), 10)
10-element ZeroPaddedVector{Float64, Vector{Float64}}: 0.31262624397203476 0.41517786688952774 0.004227989506954244 0.7345586681437709 0.32737060516588157 0.022101081626731522 0.8019427551478484 0.0 0.0 0.0