在稀疏矩阵中定义值时如何利用并行性?
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
中使用。为此,您需要将 i
或 j
之一定义为列向量,另一个定义为行向量。隐式扩展生效并计算索引。
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.
以下 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
中使用。为此,您需要将 i
或 j
之一定义为列向量,另一个定义为行向量。隐式扩展生效并计算索引。
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.