矩阵乘法java 1.8

您认为在
Java 1.8中使用新的Stream接口实现稀疏矩阵运算是否可行?如果是,我们如何实现矩阵和操作.显然,我正在寻找能够最终使用“自动”并行化. 最佳答案 它可以清楚地完成.对于简单的SPMV(稀疏矩阵向量乘法),下面的内容怎么样,稀疏矩阵以坐标
COO格式表示(最简单的稀疏格式):

class COO {
    int x, y, value;
}

public static ArrayList<Integer> spmv(List<COO> values, ArrayList<Integer> v) {
    final ArrayList<Integer> result = new ArrayList<>(Collections.nCopies(v.size(), 0));
    values.stream().forEach(
            coo -> result.set(coo.x, result.get(coo.x) + coo.value * v.get(coo.y))
    );
    return result;
}

但我真诚地建议你使用预先编码的东西,如果你不想在接下来的3年里花一些时间来理解稀疏矩阵运算的性能影响.
这是一个相当大的研究/优化主题,有许多因素需要考虑(仅仅是我的头脑):

>调度/重新排序矩阵值以提高缓存性能
>针对特定问题使用最佳存储格式(例如,请参阅netlib的此调查)

与手工制作的实现相比,有许多实现可以实现性能的数量级改进.仅举几例,请查看:

> Intel MKL Sparse BLAS
> Nvidia’s cuBLAS

如果它们不存在,我会写那些绑定到那些,虽然像la4j这样的东西看起来很有希望.

点赞