我有一个SparseArray,需要获取其所有元素的总和
我目前正在做一个数组的点积,其中相同大小的数组填充有一个,但是我觉得应该有一些更简单(更有效?)的东西
在这里找不到合适的方法:https://javadoc.scijava.org/ojAlgo/org/ojalgo/array/SparseArray.html
我有:
SparseArray<Double> lhCounts = SparseArray.factory(Primitive64Array.FACTORY, dim).make();
然后使用它进行一些操作,最后想要一些返回所有元素之和的方法,例如:
array_sum = lhCounts.sum();
答案 0 :(得分: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或N-D,则可以创建Array2D或ArrayAnyD。
Array2D<Double> lhCounts2D = Array2D.PRIMITIVE64.makeSparse(dim, dim);
ArrayAnyD<Double> lhCountsAnyD = ArrayAnyD.PRIMITIVE64.makeSparse(dim, dim, dim, dim);
Array1D,Array2D和ArrayAnyD API是为密集结构设计的。稍后添加了将它们实例化为稀疏的功能。在稀疏情况下,您可以使用它们执行的某些操作可能效率不高。您甚至可以做一些简单的愚蠢的事情,例如hugeSparseArray.fillAll(1.0)
;