【问题标题】:How to add all elements of an ojalgo SparseArray?如何添加 ojalgo SparseArray 的所有元素?
【发布时间】:2019-09-14 06:27:24
【问题描述】:

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

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

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

我有:

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

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

array_sum = lhCounts.sum();

【问题讨论】:

    标签: java arrays ojalgo


    【解决方案1】:

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

        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();
    

    如果该“数组”实际上是二维或 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:s 专为密集结构而设计。稍后添加了将它们实例化为稀疏的能力。在稀疏的情况下,您可以用它们做的一些事情可能不是很有效。你甚至可以做一些简单的蠢事,比如hugeSparseArray.fillAll(1.0);

    【讨论】:

    • 建议的 SparseArray 解决方案给了我错误:Error:(85, 55) java: method stream in interface org.ojalgo.structure.ElementView1D&lt;N,V&gt; cannot be applied to given types; required: boolean found: no arguments reason: actual and formal argument lists differ in length
    • Array1D 解决方案工作正常 :) 我确实在代码的其他地方使用了 SparseStore 2D 数组,所以你说使用 Array2D 的稀疏功能更方便吗?性能是否具有可比性?
    • 如果您发现问题,请在 GitHub 上打开一个问题,并提供一个演示问题的示例。一般来说,我会说 Array1D 和 Array2D 替代品更方便,性能上也可比。
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2021-12-28
    • 2021-12-20
    • 2015-10-14
    • 2012-08-23
    • 2015-07-29
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多