如何处理Matlab parfor循环中的非分类变量?

时间:2016-05-05 14:18:13

标签: matlab

我有以下代码,我想让它并行。但不幸的是,当我使用parfor循环时,我得到以下错误。这是代码:

    parfor l1 = 1:length(lambda1_list) % over l1

        for l2 = 1:length(lambda2_list)

            params.lambda1 = lambda1_list(l1);
            params.lambda2 = lambda2_list(l2);


            [totBeta,theta,omega,rho,nu] = Learn_weights(dictionary(train_set,:), y(train_set,:), params); 

end
end

这是错误:

Error: The variable params in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".

以下是 params 的外观 params =

lambda1_list: [1 1.5000 2 2.5000 3 3.5000 4 4.5000 5 5.5000 6 6.5000 7 7.5000 8 8.5000 9 9.5000 10]
lambda2_list: [1 1.5000 2 2.5000 3 3.5000 4 4.5000 5 5.5000 6 6.5000 7 7.5000 8 8.5000 9 9.5000 10]
    features: [50x2 double]
        mcut: [1 1 1 1 1 1 1 1 1 1]
learnWeights: 0
   beta_init: [50x10 double]
     lambda1: 10
     lambda2: 10
     stopVal: 1.0000e-05

我想知道有人可以帮我这个吗?我需要在程序中使用 params 并使用数千行代码并将其用于不同的地方。 我正在寻找克服这个问题的技巧。

1 个答案:

答案 0 :(得分:1)

问题是您在params循环的每次迭代中修改 parfor(相同的确切数据)。如果你有两个并行的工作,理论上他们都会试图改变相同的 params结构,这显然会导致问题。

您的选择是在循环之前创建params数组,然后使用数组中的每个元素。

%// Duplicate params once for each time through the parfor loop
params_array = repmat(params, size(lambda1_list));

parfor l1 = 1:length(lambda1_list)
    for l2 = 1:length(lambda2_list)
        params_array(l1).lambda1 = lambda1_list(l1);
        params_array(l1).lambda2 = lambda2_list(l2);

        [totBeta,theta,omega,rho,nu] = Learn_weights(dictionary(train_set,:), y(train_set,:), params_array(l1)); 
    end
end

另一种选择是在修改之前创建params的副本。

parfor l1 = 1:length(lambda1_list)

    %// Make a copy of the params that is local to this loop iteration
    this_param = params;

    for l2 = 1:length(lambda2_list)
        %// Modify this copy
        this_param.lambda1 = lambda1_list(l1);
        this_param.lambda2 = lambda2_list(l2);

        %// Pass this modified copy to Learn_weights
        [totBeta,theta,omega,rho,nu] = Learn_weights(dictionary(train_set,:), y(train_set,:), this_param); 
    end
end