Dear Tim, Much to learn. Thank you again for all your help. It is very much appreciated.
Christoph On Monday, 17 November 2014 20:01:08 UTC, Christoph Ortner wrote: > > I would appreciate advise how to best implement the following: > > I have an N^d array A, where the dimension d depends on the > application (d \in \{1, 2, 3\}). Somewhere else I have a list L which is a > d x M array or integers corresponding to points/elements in this array, > e.g. if > L[:, 3] == [5, 2, 8] > then A would be N^3 and > M[L[1,3], L[2,3], L[3,3]] > would read > A[5, 2, 8] > > The difficulty is that I would like to read from A in a *fast* > dimension-independent way. My only idea was to define a type and overload > getindex, setindex! ; see below. If I tested this correctly, then I only > loose a factor of two in terms of both speed and memory. > > I am slightly worried that it is a non-standard access to a standard > array. + I'd love to get that factor 2 back. Hence, I'd like to know > whether there are faster / more elegant alternatives, or just other ways of > doing this? > > > > module damod > > > > export darray > > immutable type darray > > data > > dim > > end > > > > function darray(A) > > return darray(A, length(size(A))) > > end > > > > export getindex > > function getindex(A::darray, ii) > > if A.dim == 2 > > return A.data[ii[1], ii[2]] > > elseif A.dim == 3 > > return A.data[ii[1], ii[2], ii[3]] > > end > > end > > end > > > > using damod > > N = 100 > > a = darray(rand(N, N, N)) > > @time for n = 1:N, m=1:N, k=1:N; dummy = a[[n,m,k]] end > > @time for n = 1:N, m=1:N, k=1:N; dummy = a.data[n,m,k] end > > @time for n = 1:N, m=1:N, k=1:N; dummy = a[[n,m,k]] end > > @time for n = 1:N, m=1:N, k=1:N; dummy = a.data[n,m,k] end > > @time for n = 1:N, m=1:N, k=1:N; dummy = a[[n,m,k]] end > > @time for n = 1:N, m=1:N, k=1:N; dummy = a.data[n,m,k] end > > > > > > > > elapsed time: 0.470031905 seconds (128633244 bytes allocated, 11.90% gc time) > elapsed time: 0.209358484 seconds (48565624 bytes allocated, 8.98% gc time) > elapsed time: 0.42617227 seconds (128641396 bytes allocated, 16.12% gc time) > elapsed time: 0.21529278 seconds (48565624 bytes allocated, 10.65% gc time) > elapsed time: 0.457094657 seconds (128565624 bytes allocated, 14.37% gc time) > elapsed time: 0.201969234 seconds (48565624 bytes allocated, 10.24% gc time) > > > >