( Re Message From: Braddock Gaskill )

>

> A 3-dimensional array datatype would be infinitely useful to me in Octave.

>

> I'm interested in either knowing how to use one, or implementing one

> myself. I see there is an Array3 class in liboctave/Array3.cc, but there

> is no documentation on how to use it in the octave interpreter (if that's

> possible...there is only one reference to the class in a

> `grep Array3 src/*.cc`).

>

> Is there any way to implement a 3D array in Octave? The closest I can

> figure out using the obvious datatypes would be to make a data structure

> of matricies with some nasty eval's to access the elements.

>

> Thanks a googol!

>

> -Braddock

It ain't quite as bad as that ... You can take a hint from C, where an

array is a linear block accessed by a computed pointer. The following is a

skeleton example to implement a d-dimensional array, exemplified with d=4.

Maybe it could be a touch more elegant, and it needs array-bound checks

and such before it's fit to be let out on its own, but you get the idea.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

A.n_dims = 4;

A.dims = [2;2;3;3];

A.elems = [

1111; 1112; 1113; 1121; 1122; 1123; 1131; 1132; 1133;

1211; 1212; 1213; 1221; 1222; 1223; 1231; 1232; 1233;

2111; 2112; 2113; 2121; 2122; 2123; 2131; 2132; 2133;

2211; 2212; 2213; 2221; 2222; 2223; 2231; 2232; 2233; ];

function x = elem(X,j) # X a d-dim array, j a d-vector of "coordinates"

d = X.n_dims; k = X.dims; k = flipud(cumprod(flipud(k)));

i = j(d); for r=1:d-1, i = i+(j(r)-1)*k(r+1); endfor

x = X.elems(i);

endfunction

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

octave-2:13> elem(A,[1;1;1;1])

ans = 1111

octave-2:14> elem(A,[1;1;2;1])

ans = 1121

octave-2:15> elem(A,[2;1;3;2])

ans = 2132

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

You could also try further tricks (e.g. using NaN) to access sub-arrays,

e.g. elem(A,[1,NaN,NaN,NaN]) would return the 2x3x3 array with i1=1,

elem(A,[1,NaN,3,NaN) the 2x3 with i1=1, i3=3

(not forgetting to recompute .n_dims and .dims).

Hope this helps,

Ted. (

[hidden email])