【问题标题】:Matrix variables cannot be classified in PARFOR loop in MatlabMatlab的PARFOR循环中不能对矩阵变量进行分类
【发布时间】:2018-08-11 06:28:54
【问题描述】:

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

我想将两个函数的返回相加,并将不同索引alpha下的值保存到ga的不同位置,所以ga应该归类为约简变量,不是吗? (虽然 Matlab 无法对其进行分类。)

如何调试代码,让parfor运行成功?

【问题讨论】:

    标签: matlab loops parallel-processing parfor


    【解决方案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
    

    【讨论】:

    • 但是,当我必须使用矩阵来存储具有相似索引的不同函数的结果时,这种方法很繁琐。例如,如果我有一个函数族,例如 T_1,T_2,...,T_n,那么我必须定义 ga1,ga2,...,ga_n。这将是一个令人沮丧的重复。如何避免这个问题?
    • 也许你可以增加结果数组的维度?例如查看编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多