4

申し訳ありませんが、現在、コードを最小限の例に要約することができません。これは、画像処理コードの膨大な束です。

画像 (変数 stphogs の記述子) を反復処理するループがあり、画像ごとに検出を実行します。

function hogpatches = extractDetectionsFromImages(stphogs, poselet)
    hogpatches = cell(1,length(stphogs));

    parfor i = 1:length(stphogs)
        tmp = extractDetectionsFromImage(stphogs(i), poselet); %e.g. 1x6 struct

        if ~isempty(tmp)
            hogpatches{i} = tmp;
        end
    end

    hogpatches = cell2mat(hogpatches);
end

これがメインループです。しかし、関数呼び出しはextractDetectionsFromImage非常に深くなります。

私の問題:通常の for ループでこれを実行すると、正しい結果が得られます。上記のように PARFOR を使用するhogpatchesと、18 個ではなく 5 個の構造体のみが含まれます。

どこからエラーを探すことができますか? プログラムが変更したグローバル変数がありました。私はすでにそれを削除しました。ただし、読み取り専用のグローバル変数「config」がまだあります..他のヒントはありますか?何が問題なのですか?

編集: 1 回の反復を実行しただけでも (stphogs のサイズは 1)、parfor は失敗します。パートとは関係ありませんisempty。それを削除しても問題は解決しません。

EDIT2:わかりましたここで、最小限の実例に煮詰めました。それは確かにグローバル変数によって引き起こされます:

function parGlobalTest()
    global testVar;

    testVar = 123;

    parfor i = 1:1
        fprintf('A Value: %d\n', testVar);
        testFunction();
    end
end

function testFunction()
    global testVar;
    fprintf('B Value: %d\n', testVar);
end

この例では。A の出力は 123、B の出力は何もありません (未定義)。何故ですか?

4

1 に答える 1

1

わかりました、ここに私の解決策があります:

function syncTestVar()
    global testVar;
    save('syncvar.mat', 'testVar');
    pctRunOnAll global testVar;
    pctRunOnAll load('syncvar.mat');
end

誰かがより良いアプローチを持っている場合は教えてください...これはうまくいきます

testVarところで:私の実際のプログラムでは複雑な構造体であるため、保存/読み込みが必要です

于 2012-08-02T15:47:12.030 に答える