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

次の解決策を見つけましたが、うまくいくようです。プログラムは少し違うように見えますが、形は同じです。このようにして、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 に答える