C# 填充稀疏矩阵并行

C# 填充稀疏矩阵并行,c#,sparse-matrix,numeric,allocation,indexoutofrangeexception,C#,Sparse Matrix,Numeric,Allocation,Indexoutofrangeexception,我有一个来自Extreme.Mathematics.linearagebra的稀疏矩阵,比如: SparseMatrix<double> J = Matrix.CreateSparse<double>(amountI, amountJ); SparseMatrix J=Matrix.CreateSparse(amountI,amountJ); 现在我想在一个并行循环中填充它,因为并行填充应该更快 Parallel.For(0, amountI, i => {

我有一个来自
Extreme.Mathematics.linearagebra
的稀疏矩阵,比如:

SparseMatrix<double> J = Matrix.CreateSparse<double>(amountI, amountJ);
SparseMatrix J=Matrix.CreateSparse(amountI,amountJ);
现在我想在一个并行循环中填充它,因为并行填充应该更快

Parallel.For(0, amountI, i =>
{
    for (int j = 0; j < amountJ; j++)
        J[i, j] = random.Next();
});
Parallel.For(0,amountI,i=>
{
对于(int j=0;j
这给了我一个错误:超出范围异常

然而,对于正常的for循环,它工作得非常好

for (int i = 0; i < amountI; i++)
{
    for (int j = 0; j < amountJ; j++)
        J[i, j] = random.Next();
}
for(int i=0;i
此外,如果我使用2D数组而不是稀疏矩阵,它也可以正常工作

double[,] M = new double[amountI, amountJ];
Parallel.For(0, amountI, i =>
{
    for (int j = 0; j < amountJ; j++)
        M[i, j] = random.Next();
});
double[,]M=新的double[amountI,amountJ];
Parallel.For(0,amountI,i=>
{
对于(int j=0;j
如何实现并行填充稀疏矩阵而不出现超出范围的异常?

我知道这有点晚,但总比什么都没有好

稀疏矩阵与普通数组完全不同。它使用行和列的索引,仅存储矩阵的非零值。关于更多信息,我想你应该阅读极限的文档

一般来说:每次修改基础数据时,稀疏矩阵的后端都必须重新分配内存。因此,考虑到您正常循环的情况,分配将同步进行,您很好。一旦多个线程试图修改矩阵,您就会遇到麻烦,因为您在一个线程上分配了新内存,该内存会立即被另一个线程覆盖,从而在原始线程上出现异常

So:稀疏矩阵的并行填充不起作用。我还没有找到一个合适的库,它提供了并行写入稀疏矩阵的可能性