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)。
在使用之前parfor,建议阅读有关决定何时使用 parfor 的指南。特别是这个:
一般来说,如果你想让代码运行得更快,首先尝试将其向量化。
这里矢量化可以有效地用于计算非零元素的索引。这些索引用于 function 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);
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用作减少变量。