Description
openedon Mar 3, 2015
Many methods in Julia base, especially those that interface with external C libraries like BLAS, LAPACK and FFTW are only defined for StridedArray
, which currently is a Union
type. It has been argued before by @timholy that properties like strided
and contiguous
should actually be a trait (a THT).
However, my main question is about the interface for a StridedArray
, which is currently incomplete and somewhat inconsistent. The manual describes StridedArray
as being an array A
such that, increasing index k
by 1 is equivalent to linear indexing where the linear index is increased by stride(A,k)
. But that is of course not true, since linear indexing is expected to be such that the linear index increases by prod(size(A)[1:k-1])
. A simple example is A=rand(5,5);B=sub(A,1:3,1:3)
. Clearly, stride(B,2)=5
, but linear indexing with i+5*(j-1)
would not give me element (i,j)
, you need to index with i+3*(j-1)
for that. In that respect, stride(A,k)
is also defined for a general AbstractArray
and just returns prod(size(A)[1:k-1])
, which does not correspond to its description in the manual as "distance in memory".
So what is the role of StridedArray
in Julia. Is it only to interface with C libraries and to be used in combination with pointer
? It is certainly useful to also exploit the stridedness in pure Julia methods, see e.g. permutedims!
. Currently, this is dealt with by checking explicitly whether the StridedArray
is a SubArray
, and in that case, to extract the underlying parent array and the offset, and then apply linear indexing to that. I noticed that parent
is now part of the exported method list, but there is no corresponding method to get the offset
or first_index
. Maybe it would be good to have this method as well and then define these methods (stride
and strides
, parent
, offset
?) as the interface for a strided array (as type or as trait).