我试图将此循环作为parfor-loop运行:
correlations = zeros(1,N);
parfor i = 1:(size(timestamps,1)-1)
j = i+1;
dts = timestamps(j) - timestamps(i);
while (dts < T) && (j <= size(timestamps,1))
if dts == 0 && detectors(i) ~= detectors(j)
correlations(1) = correlations(1) + 2;
elseif detectors(i) ~= detectors(j)
dts = floor(dts/binning)+1;
correlations(dts) = correlations(dts) + 1;
end
j = j + 1;
if j <= size(timestamps,1)
dts = timestamps(j) - timestamps(i);
end
end
end
Matlab给了我以下错误:
Error: File: correlate_xcorr.m Line: 18 Column: 17
The variable correlations in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
第18行如下:
correlations(1) = correlations(1) + 2;
我无法理解为什么这不可能。相关的最终值不取决于循环执行的顺序,而只取决于dts和检测器。我在文档中找到了类似的例子,它们运行良好。
为什么Matlab不能执行此代码,我该如何解决?
答案 0 :(得分:2)
由于您从PARFOR循环的多次迭代中访问相关性(1)的方式,MATLAB无法确定您的循环是否与顺序无关。看起来这个值在某种程度上是“特殊的”,它应该用于制作'减少'变量,即用correlations(1)
或其他东西替换correlations_1
。
您将遇到的下一个问题是您没有正确“切片”correlations
的剩余部分。为了让MATLAB分析PARFOR循环,它需要能够告诉每个循环迭代只写入输出变量的“切片”。实际上,这意味着您必须使用字面上的循环索引来索引输出。
有关PARFOR变量分类的更多信息,请访问:http://www.mathworks.com/help/distcomp/advanced-topics.html#bq_of7_-1
编辑:
如果你希望correlations
严格地表现为减少变量,我相信你暗示你的评论,你需要给PARFOR一个线索,这就是你的意思:特别是,你需要添加到整个变量每次你需要。换句话说,更像是:
parfor ...
dummyVec = zeros(1, N);
dummyVec(elementToIncrement) = 1;
correlations = correlations + dummyVec;
end
我同意这是不明显的。有关详情,请参阅http://blogs.mathworks.com/cleve/2012/11/26/magic-squares-meet-supercomputing/。
答案 1 :(得分:1)
我找到了以下解决方案,似乎有效。该程序看起来不同,但它具有相同的形状。这样Matlab就不得不认为x / correlations是一个减少变量。
X = zeros(1,5);
parfor i= 1:1000
a = zeros(1,5);
dts = randi(10)-1;
if dts == 0
a(1) = (a(1) + 2);
elseif dts <= 5
a(dts) = a(dts) +1;
end
X = X + a;
end