多数のグリッドボックスの特性を並行して計算する簡単な化学シミュレーションを作成しました。したがって、並列ループを使用してY次元にインデックスを付けます。
function[outputArray] = stackTest()
numX = 10;
numY = 10;
numZ = 10;
outputArray = zeros(numX,numY,numZ);
for iX = 1:numX
parfor iY = 1:numY
coreArray = outputArray(iX,iY,:);
for iZ = 1:numZ
tempNum = iX*iY*iZ;
coreArray(1,1,iZ) = tempNum;
end
outputArray(iX,iY,:) = coreArray;
end
end
end
これは正常に機能します。ただし、次のコードに示すように、ブール値を使用して特定のアクションを実行するかどうかを制御しています。これは、Yで単純なfor
ループを使用する場合は正常に機能しますが、を使用するparfor
場合、コードoptionalArg
は定義されていないクレームで失敗します。
function[outputArray] = stackTest(controlArg)
numX = 10;
numY = 10;
numZ = 10;
outputArray = zeros(numX,numY,numZ);
if (controlArg)
optionalArg = 10;
end
for iX = 1:numX
parfor iY = 1:numY
coreArray = outputArray(iX,iY,:);
for iZ = 1:numZ
tempNum = iX*iY*iZ;
if controlArg
tempNum = tempNum * optionalArg;
end
coreArray(1,1,iZ) = tempNum;
end
outputArray(iX,iY,:) = coreArray;
end
end
end
stackTest
の場合は正常に動作しますが、 ;の場合は正常に動作controlArg = true
しません。controlArg = false
私が見つけたそれを回避する唯一の方法は、からoptionalArg
独立して定義することですcontrolArg
。言うまでもなく、これは問題の単純化されたバージョンですが、これを説明してくれる人には感謝します。ループがグローバルで抱えている問題のサブセットだと思いparfor
ますが、グローバルを定義していないので、少し混乱しています。
よろしく、
Skipsh