1

我正在尝试将此循环作为 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
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 不能执行此代码,我该如何解决?

4

2 回答 2

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/

于 2013-04-19T12:33:18.757 回答
2

我找到了以下解决方案,它似乎有效。该程序看起来有点不同,但它具有相同的形状。这样,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
于 2013-04-20T10:29:54.557 回答