矩阵变量无法在Matlab的PARFOR循环中分类

时间:2018-08-11 06:28:55

标签: matlab loops parallel-processing parfor

在我的for循环中,我设置了一个矩阵变量ga以保存每个循环的结果。 但是,当我将for循环更改为parfor循环(以加速)时,会出现如下警告:

enter image description here

运行代码时,出现另一个错误:

enter image description here

代码是:

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_upperT_lower都是返回数字的函数。

我想对两个函数的返回值求和,并将不同索引alpha下的值保存到ga的不同位置,因此ga应该归类为归约变量,不是吗? (尽管Matlab无法对其进行分类。)

如何调试代码并使parfor成功运行?

1 个答案:

答案 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
相关问题