在我的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
成功运行?
发布于 2018-08-17 17:37:30
您定义了在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
https://stackoverflow.com/questions/51797104
复制相似问题