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

use*_*636 1 parallel-processing matlab matrix parfor

以下 MATLAB 代码循环遍历矩阵的所有元素,其大小为 2 I J x 2 I J。

    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
Run Code Online (Sandbox Code Playgroud)

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

rah*_*ma1 6

在使用之前parfor,建议阅读有关决定何时使用 parfor 的指南。特别是这个:

一般来说,如果你想让代码运行得更快,首先尝试将其向量化。

这里矢量化可以有效地用于计算非零元素的索引。这些索引用于 function 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);
Run Code Online (Sandbox Code Playgroud)

但是为了比较,这可以是一种使用方式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
Run Code Online (Sandbox Code Playgroud)

这里D1用作减少变量