为什么你parfor
不工作的原因,工作是因为accuracy
变量以同步的方式被访问。假设您将使用单个线程遍历run_1_KNN
的调用,此行为将工作,这就是为什么只使用for
而不是parfor
。由于您在parfor
内有嵌套for
循环调用,这依赖于以前迭代中完成的工作。 parfor
不能有这种行为,它在异步的问题。每个线程执行独立于其他线程的工作。
如果要使用parfor
(也称为多线程),则必须能够以异步方式访问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
包含我之前谈到的最终矩阵。
希望这会有所帮助。祝你好运!
如果您在使用'parfor'时引用和描述错误将会很有帮助。 – Hoki 2014-09-12 19:13:36
您需要打开游泳池。 – Oleg 2014-09-12 19:22:44
你打开了一堆工人吗?在运行此代码之前,请尝试执行'matlabpool'或'parpool'。 – rayryeng 2014-09-12 19:37:05