爲什麼你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