javaarraysojalgo

How to add all elements of an ojalgo SparseArray?


I have a SparseArray and need to obtain the sum of all its elements

I'm currently doing a dot product of the array with a same-sized array filled with ones, but I feel there should be something more straightforward (and efficient?)

Can't find a proper method here: https://javadoc.scijava.org/ojAlgo/org/ojalgo/array/SparseArray.html

I have:

SparseArray<Double> lhCounts = SparseArray.factory(Primitive64Array.FACTORY, dim).make();

then do some operations with it, and finally want some method that returns the sum of all elements, something like:

array_sum = lhCounts.sum();

Solution

  • That class in primarily used as a delegate to other implementation, but it's perfectly fine to use it directly. Probably the most direct solution in this case is to do:

        array_sum = lhCounts.nonzeros().stream().mapToDouble(nz -> nz.doubleValue()).sum();
    

    There is also the possibility to create an Array1D instead. It has a richer api. Then you can do it this way:

        Array1D<Double> lhCounts1D = Array1D.PRIMITIVE64.makeSparse(dim);
        array_sum = lhCounts1D.aggregateAll(Aggregator.SUM);
    

    The nonzeros-stream is also available in this case

        array_sum = lhCounts1D.nonzeros().stream().mapToDouble(nz -> nz.doubleValue()).sum();
    

    and if that "array" is actually something 2-D or N-D you can create an Array2D or ArrayAnyD instead.

        Array2D<Double> lhCounts2D = Array2D.PRIMITIVE64.makeSparse(dim, dim);
        ArrayAnyD<Double> lhCountsAnyD = ArrayAnyD.PRIMITIVE64.makeSparse(dim, dim, dim, dim);
    

    The Array1D, Array2D and ArrayAnyD api:s were designed for dense structures. The ability to instantiate them as sparse was added at a later point. Some things you can do with them may not be very efficient in the sparse case. You can even do plain stupid things like hugeSparseArray.fillAll(1.0);