1

多数のグリッドボックスの特性を並行して計算する簡単な化学シミュレーションを作成しました。したがって、並列ループを使用して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

4

1 に答える 1

0

controlArgが false の場合はoptionalArg未定義です。MATLAB は、常に false になることを信頼していないと思いcontrolArgます (つまり、上記のコードの場合、人間はそれが明らかだと思うかもしれませんが、それを推測するメカニズムがないことを意味します)。したがって、コードのこの時点でparfor反復が知る必要がないことを保証することはできません。optionalArg

        if controlArg
            tempNum = tempNum * optionalArg;
        end

簡単に解決するにはoptionalArg、if 句を使用せずに定義controlArgします。使用する前にもう一度確認してください。または、 (または 3 行すべてを(false) を 1 に、(true) を の目的の値にマップする数式で)に置き換えoptionalArgてみてください。10*controlArg01optionalArgtempNum = tempNum * (controlArg*9+1);

ところで:実際の問題についてもう少し詳しく説明できるかもしれません(必ずしもこの質問ではありません)。上記の出力配列は、1 行または 2 行のコードで生成できます。MATLAB の利点の 1 つは、(明示的な並列化なしで) 一度に多くの同様の操作のベクトル化された計算を問題に適用できることだと思います (つまり、 3 レベルのforループは必要ありません。

于 2013-02-20T19:24:02.133 に答える