I have a mult-dimension matrix (or perhaps tensor more appropriately), for example:
a = rand(5, 5, 5, 5)
. It satisfies translational symmetry, i.e. a[i, j, k, l] = a[i - k, j, l]
.
In such case, how could I save the memory for constructing this? I would use it for some tensor contraction. Thank you!
You could create a custom <: AbstractArray
type that calculates the required elements on demand, just storing a single one from each equivalence class. Just implement the Array interface (link is to latest, if you are using v0.6 change accordingly).
Following your suggestion, I am trying something like this:
struct TransSymmetric{T, N} <: AbstractArray{T, N}
data::AbstractArray{T, N-1}
dims::NTuple{N, Int}
end
Since the underlying data is one dim less than what it appears, I intend to try N-1
in the type parameters, which is wrong, however. Then I tried:
struct TT1{T, N} <: AbstractArray{T, N}
data::AbstractArray{T, typeof(TT1).parameters[2]-1}
dims::NTuple{N, Int}
end
This shows that BoundsError: attempt to access svec()
. I assume the struct hasn’t been initiated before accessing its type parameters? My question is how can I restrict the dim of data
inside?
This isn’t something you can do, unfortunately. For a workaround, see templates - Expressions depending on integer type parameters in type definitions in Julia are not allowed - Stack Overflow and Arithmetic on integer type parameters
Use two independent type parameters, and have an inner constructor check them.