您parfor
不工作的原因是因为accuracy
正在以同步方式访问变量。假设您要遍历run_1_KNN
使用单个线程的调用,这种行为将起作用,这就是为什么只使用 afor
而不是parfor
. 由于您在 内有一个嵌套 for
循环调用parfor
,这依赖于以前迭代中完成的工作。 parfor
不能有这种行为,它以异步方式工作。每个线程执行应该独立于其他线程的工作。
如果你想使用parfor
(又名多线程),你必须能够以accuracy
异步的方式访问。我建议你做的是在你的循环之外创造独特的配对k
价值。然后,您将使用单个来访问每个唯一的and对,然后访问您的数组。我将为您做的是创建一个最终矩阵,其中第一列为,第二列为,第三列为准确度值。因此,对于该矩阵的每一行,它会为您提供什么、以及该特定三元组的准确度。像这样: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
包含我之前谈到的最终矩阵。
希望这可以帮助。祝你好运!