在稀疏矩阵中定义值时如何利用并行性?

How can I exploit parallelism when defining values in a sparse matrix?

以下 MATLAB 代码循环遍历大小为 2IJ x 2IJ.[=12= 的矩阵的所有元素]

    for i=1:(I-2)
        for j=1:(J-2)
            ij1 = i*J+j+1; % row
            ij2 = i*J+j+1 + I*J; % col 
            D1(ij1,ij1) = 2;
            D1(ij1,ij2) = -1;
        end
    end

有什么方法可以使用 MATLAB 的 parfor 命令将其并行化吗?您可以假设任何未定义的元素都是 0。所以这个矩阵最终是稀疏的(主要是 0)。

在使用parfor之前,建议阅读与decide when to use parfor相关的指南。特别是这个:

Generally, if you want to make code run faster, first try to vectorize it.

这里可以有效地使用矢量化来计算非零元素的索引。这些索引在函数 sparse 中使用。为此,您需要将 ij 之一定义为列向量,另一个定义为行向量。隐式扩展生效并计算索引。

I = 300;
J = 300;
i = (1:I-2).';
j = 1:J-2;
ij1 = i*J+j+1;
ij2 = i*J+j+1 + I*J;

D1 = sparse(ij1, ij1, 2, 2*I*J, 2*I*J) +  sparse(ij1, ij2, -1, 2*I*J, 2*I*J);

然而,对于比较,这可以是使用 parfor 的一种方式(未测试):

D1 = sparse (2*I*J, 2*I*J);
parfor i=1:(I-2)
    for j=1:(J-2)
        ij1 = i*J+j+1; 
        ij2 = i*J+j+1 + I*J;  
        D1 = D1 + sparse([ij1;ij1], [ij1;ij2], [2;-1], 2*I*J, 2*I*J) ;
    end
end

此处D1用作reduction variable.