在我的for
循环中,我设置了一个矩阵变量ga
以保存每个循环的结果。
但是,当我将for
循环更改为parfor
循环(以加速)时,会出现如下警告:
运行代码时,出现另一个错误:
代码是:
R=100;
alpha_set = [1,2,3,4,5]; % This is an index set
ga = zeros(2,5); % to save results of addition
parfor h=1:R
[A1,A2] = random_sample(A,0.6);
...
for ai=1:5
alpha = alpha_set(ai);
ga(1,ai) = ga(1,ai) + T_lower(A2,alpha)/R;
ga(2,ai) = ga(2,ai) + T_upper(A2,alpha)/R; % accumulation
end
end
T_upper
和T_lower
都是返回数字的函数。
我想对两个函数的返回值求和,并将不同索引alpha下的值保存到ga
的不同位置,因此ga
应该归类为归约变量,不是吗? (尽管Matlab无法对其进行分类。)
如何调试代码并使parfor
成功运行?
答案 0 :(得分:1)
您可以定义数组以将结果保存在parfor循环之前,但是请尝试从并行循环内访问它。如上所述,Matlab无法对变量进行分类。问题是ga被索引在嵌套的for循环内。下面的代码使用一个索引不同的变量来解决此问题。
R=100;
alpha_set = [1,2,3,4,5]; % This is an index set
N = 2;
gas = zeros(R,length(alpha_set),N);
parfor h=1:R
A = 1.0;
[A1,A2] = random_sample(A,0.6);
for ai=1:5
alpha = alpha_set(ai);
for ni = 1:N
switch ni
case 1
gas(h,ai,ni) = T_lower(A2,alpha)/R;
case 2
gas(h,ai,ni) = T_upper(A2,alpha)/R;
end
end
end
end
gaResults = zeros(N,length(alpha_set));
for ni = 1:N
gaResults(ni,:) = sum(gas(:,:,ni),1);
end
function [ output ] = T_lower( a1,a2 )
output = a1*a2;
end
function [ output ] = T_upper( a1,a2 )
output = a1+a2;
end
function [o1,o2] = random_sample(a1,a2)
output = a1 + a2.*randn(1,2);
o1 = output(1);
o2 = output(2);
end