2

我有一个 SparseArray,需要获取其所有元素的总和

我目前正在用一个相同大小的数组填充一个数组的点积,但我觉得应该有一些更直接(和高效?)

在这里找不到合适的方法:https ://javadoc.scijava.org/ojAlgo/org/ojalgo/array/SparseArray.html

我有:

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

然后用它做一些操作,最后想要一些返回所有元素总和的方法,比如:

array_sum = lhCounts.sum();
4

1 回答 1

2

该类主要用作其他实现的委托,但直接使用它完全没问题。在这种情况下,最直接的解决方案可能是:

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

也可以改为创建 Array1D。它有更丰富的api。然后你可以这样做:

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

在这种情况下,非零流也可用

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

如果该“数组”实际上是 2-D 或 ND,您可以创建一个 Array2D 或 ArrayAnyD 来代替。

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

Array1D、Array2D 和 ArrayAnyD api:s 专为密集结构而设计。稍后添加了将它们实例化为稀疏的能力。在稀疏的情况下,您可以用它们做的一些事情可能不是很有效。你甚至可以做一些简单的愚蠢的事情,比如hugeSparseArray.fillAll(1.0)

于 2019-09-14T07:32:32.663 回答