此代码无法使用parfor但不能使用parfor
load ('../segment.mat');
accuracy = zeros(30,1);
l=1;
parfor k = 1 : 2 : 9
for p = 0.5 : 0.5 : 3
if p ~= 0
pred = run_1_KNN(k , p , X);
accuracy(l,1) = mean(strcmp(pred', y.train));
l= l + 1;
end
end
end
答案 0 :(得分:4)
parfor
无效的原因是因为accuracy
变量是以同步方式访问的。假设您要使用单个线程迭代run_1_KNN
的调用,这种行为将起作用,这就是为什么只使用for
而不是parfor
。由于您在for
中有一个嵌套 parfor
循环调用,这依赖于之前迭代中完成的工作。 parfor
无法具有此行为,并且它在异步事务中起作用。每个线程执行的工作应独立于其他线程。
如果要使用parfor
(a.k.a。多个线程),则必须能够以异步方式访问accuracy
。我建议你做的是在k
循环之外的唯一配对中创建p
和parfor
的值。然后,您可以使用单个parfor
访问每个唯一的k
和p
对,然后访问您的accuracy
数组。我要为您做的是创建一个最终矩阵,其第一列为k
,第二列为p
,第三列为精度值。因此,对于此矩阵的每一行,它会为您提供k
,p
以及该特定三元组的准确度。就这样:
[karray, parray] = meshgrid(1 : 2 : 9, 0.5 : 0.5 : 3);
karray = karray(:);
parray = parray(:);
accuracy = zeros(numel(karray), 1);
parfor idx = 1 : numel(karray)
k = karray(idx);
p = parray(idx);
pred = run_1_KNN(k , p , X);
accuracy(idx) = mean(strcmp(pred', y.train));
end
final_mat = [karray parray accuracy];
请注意我使用if
语句删除了条件,因为永远不会有p
的值等于0. if
语句中的代码将始终运行所以我决定将其删除为更清洁。此代码现在应该运行,并且应该独立于for
循环中的任何先前迭代。这也应该异步运行。 final_mat
包含我之前谈过的最终矩阵。
希望这会有所帮助。祝你好运!