2

此代码在没有 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
4

1 回答 1

4

parfor不工作的原因是因为accuracy正在以同步方式访问变量。假设您要遍历run_1_KNN使用单个线程的调用,这种行为将起作用,这就是为什么只使用 afor而不是parfor. 由于您在 内有一个嵌套 for循环调用parfor,这依赖于以前迭代中完成的工作。 parfor 不能有这种行为,它以异步方式工作。每个线程执行应该独立于其他线程的工作。

如果你想使用parfor(又名多线程),你必须能够以accuracy异步的方式访问。我建议你做的是在你的循环之外创造独特的配对k价值。然后,您将使用单个来访问每个唯一的and对,然后访问您的数组。我将为您做的是创建一个最终矩阵,其中第一列为,第二列为,第三列为准确度值。因此,对于该矩阵的每一行,它会为您提供什么、以及该特定三元组的准确度。像这样:pparforparforkpaccuracykpkp

[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包含我之前谈到的最终矩阵。


希望这可以帮助。祝你好运!

于 2014-09-12T20:28:04.587 回答