https://github.com/JeffFessler/ConstantArrays.jl
A Julia data type that is a subtype of AbstractArray
where every element is the same constant.
The "constant" in the name has two meaning:
every element of the array has the same constant value,
and the array is immutable
(setindex!
is unsupported).
This package is now a subset of the existing
FillArrays.jl
package
(that I did not know about when I wrote it).
My original version had a extra couple features
but I contributed those to FillArrays
.
So now I will no longer maintain this package
and I strongly recommend you use FillArrays
instead.
At the Julia REPL run:
using Pkg; Pkg.add("ConstantArrays")
.
At the Julia REPL execute:
using ConstantArrays
,
then type ?ConstantArray
and press enter to get help.
Primary usage example:
x = ConstantArray(42, (5,7))
makes a "lazy" constant "array"
functionally equivalent to fill(42, (5,7))
but essentially requires only
the memory need to store a struct
with the value 42
and the dimensions (5,7)
.
The motivating use of this type
is for the "masks" used in tomographic image reconstruction
that are often uniform
but also often patient conforming.
The default one-argument usage
mask = ConstantArray((4,6))
uses true
(i.e., one(Bool)
)
as the constant value
for this purpose.
The idea here is somewhat analogous
to the UniformScaling
type (I
)
in the LinearAlgebra
package.
Arguably that I
is non-essential
because one could accomplish something similar
using Diagonal(ones(N))
but I
requires much less memory.
Likewise,
arguably ConstantArray
is non-essential, but
ConstantArray(true, (100,100,100))
uses about a million times
less memory than trues(100,100,100)
.
A better analogy might be a sparse array,
where only the nonzero values are stored
to save memory.
A ConstantArray
needs only to store only a single value.
The most useful operations are probably
x .* y
and y[x]
,
both of which are faster
with a ConstantArray
than with trues(dim)
.
Developed by Jeff Fessler at the University of Michigan, with some inspiration from ReadOnlyArrays.jl.