申し訳ありませんが、現在、コードを最小限の例に要約することができません。これは、画像処理コードの膨大な束です。
画像 (変数 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 の出力は何もありません (未定義)。何故ですか?