That's interesting. The JTransforms library performs Fourier transforms that can take complex input, output, or both. They do this with interleaved double[] arrays, which I suppose is much more space efficient, and the status of a number as real or imaginary is implicit by its location being odd or even.
The MultidimensionalCounter functionality you mention is for example known in Matlab as ind2sub() and sub2ind() . It allows for 1d vectorizing of certain functions which can improve performance. Some people swear by it. I always found it an additional mental exercise that I didn't want to occupy myself with unless I absolutely had to. So, maybe it makes sense to "advertise" this approach like you say, but some users may just want the 3D arrays for more rapid prototyping-ish applications. I wonder if there isn't some streaming solution for this -- the numbers are stored as an interleaved 1D array, but are streamed through a Complex constructor before any needed operations are performed. And I guess that leads to my last question -- suppose someone wants to call a trig function on a series of Complex numbers. Now let's imagine the primitives have been stored in some maximally efficient way. It seems like, to use any of the functionality in Complex, these numbers would have to be unpacked, cast as Complex, operated on, then cast back to how they are being stored. I wonder if that would prove to be more efficient in the end. On Sat, Nov 2, 2019 at 7:14 PM Gilles Sadowski <gillese...@gmail.com> wrote: > Hello. > > The class "ComplexUtils" deal with multi-dimensional arrays that hold > instances of the "Complex" class. > I've recently encountered a use-case where it was pointed out that storing > many "Complex" instances (as seems the purpose of these utilities) is quite > inefficient memory-wise as each instance will take 32 bytes[1] while the > real and imaginary parts would only take 16 bytes as 2 primitive "double"s. > This is compounded by multi-dimensional array where each sub-dimensional > element is an array object (and thus takes another additional 16 bytes). > For example, a > double[10][5][4] > would take > 16 * (1 + 10 * 5) + 10 * 5 * 4 * 8 > = 2416 bytes. > Assuming that in the above array, the last dimension holds 2 complex > numbers, > the same data can be represented as > Complex[10][5][2] > that would take > 16 * ((1 + 10 * 5) + (10 * 5 * 2)) + 10 * 5 * 2 * 2 * 8 > = 4016 bytes. > In both cases, the payload (10 * 5 * 2 complex numbers) is > 10 * 5 * 2 * 2 * 8 > = 1600 bytes. > If stored in a one-dimensional array, the size in memory would be 1616 > bytes. > Thus in the case of a data cube holding 100 complex numbers, a 3D array > takes 1.5 (primitives) or 2.5 ("Complex" objects) more memory than a 1D > array. > If this is correct, I wonder whether we should advertise such a > "ComplexUtils" > class. It would perhaps be preferable to propose a data cube > abstraction.[2] > > WDYT? > > Regards, > Gilles > > [1] https://www.baeldung.com/java-size-of-object > [2] Based on > http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/util/MultidimensionalCounter.html > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > >