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

如何处理Matlab parfor循环中的未分类变量?,matlab,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); [t

我有以下代码,我想让它并行。但不幸的是,当我使用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的样子 参数=

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
我想知道有人能帮我吗?我需要在程序中有参数,因为它有数千行代码,在不同的地方使用。 我正在寻找克服这个问题的诀窍。

问题是,在
parfor
循环的每次迭代中,您都在修改
params
(相同的精确数据)。如果有两个并行作业,理论上它们都会试图更改相同的
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