您认为可以使用 Java 1.8 中的新 Stream 接口实现稀疏矩阵运算吗?如果是,我们需要如何实现矩阵和操作。显然,我正在寻找它最终能够使用“自动”并行化。
问问题
1009 次
1 回答
2
显然是可以做到的。对于一个简单的 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上的此调查)
与手工实现相比,有许多实现可以在性能上实现数量级的改进。仅举几例,请查看:
如果它们尚不存在,我只会为它们编写绑定,尽管像la4j这样的东西看起来很有希望。
于 2014-10-18T17:24:15.333 回答