并行填充稀疏矩阵

问题描述 投票:0回答:1

我有一个稀疏矩阵,从 Extreme.Mathematics.LinearAlgebra 喜欢。

SparseMatrix<double> J = Matrix.CreateSparse<double>(amountI, amountJ);

现在我想把它填入一个平行的循环中, 因为用平行的方式填入应该更快。

Parallel.For(0, amountI, i =>
{
    for (int j = 0; j < amountJ; j++)
        J[i, j] = random.Next();
});

这给了我一个错误:out of range异常。

然而,对于一个普通的for循环,它工作得很好。

for (int i = 0; i < amountI; i++)
{
    for (int j = 0; j < amountJ; j++)
        J[i, j] = random.Next();
}

此外,如果我使用一个二维数组而不是一个稀疏矩阵,它也能正常工作。

double[,] M = new double[amountI, amountJ];
Parallel.For(0, amountI, i =>
{
    for (int j = 0; j < amountJ; j++)
        M[i, j] = random.Next();
});

我如何实现在并行填充一个稀疏矩阵而不出现范围外异常?

c# sparse-matrix numeric allocation indexoutofrangeexception
1个回答
1
投票

我知道这有点晚了,但总比没有好。

Sparse矩阵与普通数组完全不同。它使用行和列的索引,只存储矩阵的非零值。要想了解更多信息,我想你应该阅读Extreme的文档。

一般来说。稀疏矩阵的后端在每次修改底层数据时 都要重新分配内存。所以给你正常循环的情况下,分配会同步发生,你就没事了。只要多个线程试图修改矩阵,你就会遇到麻烦,因为在一个线程上你分配了新的内存,马上就会被另一个线程覆盖,给你原来的线程带来异常。

所以。 稀疏矩阵的并行填充方法 行不通. 我还没有找到一个合适的库来提供向稀疏矩阵并行写入的可能性。

© www.soinside.com 2019 - 2024. All rights reserved.