简体   繁体   中英

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

The following MATLAB code loops through all elements of a matrix with size 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

Is there any way I can parallelize it use MATLAB's parfor command? You can assume any element not defined is 0. So this matrix ends up being sparse (mostly 0s).

Before using parfor it is recommended to read the guidelines related to decide when to use parfor . Specially this:

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

Here vectorization can be used effectively to compute indices of the nonzero elements. Those indices are used in function sparse . For it you need to define one of i or j to be a column vector and another a row vector. Implicit expansion takes effect and indices are computed.

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);

However for the comparison this can be a way of using parfor (not tested):

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

Here D1 used as reduction variable .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM