我有以下代码,我想让它并行。但不幸的是,当我使用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 并使用数千行代码并将其用于不同的地方。 我正在寻找克服这个问题的技巧。
答案 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