我尝试将此循环作为parfor循环运行:
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
endMatlab给出了以下错误:
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不能执行这段代码,我如何修复它?
发布于 2013-04-20 18:29:55
我找到了下面的解决方案,它似乎起作用了。这个程序看起来有点不同,但它的形状是一样的。这样,Matlab被迫认为x/相关性是一个约简变量。
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发布于 2013-04-19 20:33:19
MATLAB无法确定您的循环是否与顺序无关,因为您访问PARFOR循环的多次迭代的相关性(1)的方式不同。看起来这个值在某种程度上是“特殊的”,它应该可以用来做一个“缩减”变量,比如用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/。
https://stackoverflow.com/questions/16101142
复制相似问题