Matlab 基于外部布尔值的PARFOR with if/else子句

Matlab 基于外部布尔值的PARFOR with if/else子句,matlab,if-statement,parfor,Matlab,If Statement,Parfor,我写了一个简单的化学模拟,它并行计算了大量网格盒的属性。因此,我使用平行循环索引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 =

我写了一个简单的化学模拟,它并行计算了大量网格盒的属性。因此,我使用平行循环索引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上为循环使用简单的
时,这可以正常工作,但当使用
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
,则不能正常工作;我找到的唯一解决方法是独立于
controlArg
定义
optionalArg
。不用说,这是问题的简化版本,但如果有人能向我解释这一点,我将不胜感激;我怀疑这是
parfor
loops与globals之间存在的问题的一个子集,但是由于我没有定义globals,所以我有点困惑

问候,


Skipsh

controlArg
为false时,
optionalArg
未定义。我猜MATLAB不相信你说,
controlArg
总是错误的(我的意思是,它没有任何机制来推断它,尽管对于上面的代码,人类可能会认为这是显而易见的)。因此,它不能保证在代码的这一点上,没有任何
parfor
迭代需要知道
optionalArg

        if controlArg
            tempNum = tempNum * optionalArg;
        end
要快速修复问题,请定义
optionalArg
,而不使用周围的if子句——在使用它之前,请再次检查
controlArg
。或者,尝试将
optionalArg
替换为
10*controlArg
(或者将所有三行替换为将
0
(false)映射为1和
1
(true)的某个数学表达式,以将
optionalArg
替换为所需的
optionalArg
,例如
tempNum=tempNum*(controlArg*9+1);


顺便说一句:也许你可以告诉更多关于实际问题(不一定在这个问题上)。上面的输出数组可以由一行或两行代码生成,我想MATLAB的一个优点是,一次对许多类似操作进行矢量化计算(无显式并行化),也可以应用于您的问题(也就是说,对于
循环,您可能不需要三个级别的

不幸的是,问题比我在这里给出的更复杂-如果controlArg为真,那么将定义大量其他变量(这里用optionalArg表示),并执行一组额外的计算(特别是气溶胶化学,因为它值多少钱)。我想我很困惑,因为如果我使用
for
,只有
parfor
,没有错误。我可以按照你建议的方式解决它,但这很令人沮丧,因为这意味着我有多余的变量不必要地声明-最好确切地知道为什么会发生这种情况!正如我上面所暗示的,我想这是因为matlab分析了代码在
parfor
块中,检查使用的所有变量在循环内是否没有变化(这将使循环迭代相互依赖,并且(很容易)不可并行)并遇到不一定定义的变量。您的额外变量是数百万元素矩阵吗?如果不是,具体问题是什么?无论如何,如果存在复杂的计算差异,您可能应该为t编写两个独立的函数
complexcalculationwithout control
,以及
complexCalculationWithControl
他解释了内部部分。这很公平。我没有真正考虑到这可能会使循环相互依赖。我将按照建议重写代码-谢谢!