矢量化的FOR-LOOP MATLAB代码中的错误



我有一个我想向量化的循环代码。以下是循环代码的初始代码,也是该代码的矢量化版本。矢量化代码与PARFOR循环的结果没有相同的结果,因此我知道代码有问题。如果论坛的任何成员可以帮助我查看矢量规范,并查看他们是否可以向我指出我的错误,我将不胜感激。预先感谢您。

初始化和预先计算%w是n x 1矢量%beta:大于0的任何数字通常设置为1。这是我需要矢量化的循环代码:

f = zeros(n,1);
x = w;
y = w;
rho = 1;
v = f – (rho*y);
rhow = rho*w;
n = length(w);
parfor i = 1 : n
if w(i) >= 0
    if v(i) < -rhow(i) – beta – 1
        x(i) = (-beta -1 -v(i))/rho;
    elseif (-rhow(i) – beta – 1 <= v(i)) && (v(i) <= -rhow(i) + beta – 1)
        x(i) = w(i);
    elseif (-rhow(i) + beta – 1 < v(i)) && (v(i) < beta – 1)
        x(i) = (beta – 1 -v(i))/rho;
    elseif (beta – 1 <= v(i)) && (v(i) <= beta + 1)
        x(i) = 0;
    else
        x(i) = (beta + 1 – v(i))/rho;
    end
else
    if v(i) < -beta -1
        x(i) = (-beta -1 – v(i))/rho;
    elseif (-beta – 1 <= v(i) )&& (v(i) <= -beta + 1)
        x(i) = 0;
    elseif (-beta + 1 < v(i)) && (v(i) < -rhow(i) – beta + 1)
        x(i) = (-beta + 1 – v(i))/rho;
    elseif (-rhow(i) – beta + 1 <= v(i)) && (v(i) <= -rhow(i) + beta + 1)
        x(i) = w(i);
    else
        x(i) = (beta + 1 – v(i))/rho;
    end
end

结束

================================================================================

这是我以上代码的矢量化版本:

cond1 = (w >= 0);
cond2 = (w >= 0) & (v < -rhow-beta-1);       
x(cond2) = (-beta-1-v(cond2))/rho; 
cond3 = (w>=0)&(-rhow - beta -1 <= v) & (v <= -rhow + beta - 1);
x(cond3) =  w(cond3);
cond4 = (w>=0) & (-rhow +beta - 1 < v) & (v < beta - 1);
x(cond4) = (beta - 1 - v(cond4))/rho;
cond5 = (w>=0) & (beta - 1 <= v) & (v <= beta + 1);
x(cond5) = 0;
cond6 = (~cond2);
x(cond6) = (beta + 1 - v(cond6))/rho;
cond7 = ((~cond1) & v < -beta -1);
x(cond7) = (-beta -1 - v(cond7))/rho;
cond8 = ((~cond1) & (-beta - 1 <= v) & (v <= -beta + 1));
x(cond8) = 0;
cond9 = ((~cond1) & (-beta + 1 < v) & (v < -rhow - beta + 1));
x(cond9) = (-beta + 1 - v(cond9))/rho;
cond10 = ((~cond1) & (-rhow - beta + 1 <= v) & (v <= -rhow + beta + 1));
x(cond10) = w(cond10);
cond11 = (~cond1);
x(cond11) = (beta + 1 - v(cond11))/rho;

我正在添加另一个答案,并检查了所有条件:

cond1 = (w >= 0);
cond2 = cond1 & (v < -rhow – beta – 1);
cond3 = cond1 & ((-rhow – beta – 1 <= v) && (v <= -rhow + beta – 1));
cond4 = cond1 & ((-rhow + beta – 1 < v) && (v < beta – 1));
cond5 = cond1 & ((beta – 1 <= v) && (v <= beta + 1));
cond6 = cond1 & (v > beta + 1)
cond7 = ~cond1 & (v < -beta -1);
cond8 = ~cond1 & ((-beta – 1 <= v ) && (v <= -beta + 1));
cond9 = ~cond1 & ((-beta + 1 < v) && (v < -rhow – beta + 1));
cond10 = ~cond1 & ((-rhow – beta + 1 <= v) && (v <= -rhow + beta + 1));
cond11 = ~cond1 & (v > -rhow + beta + 1);

x(cond2)= ... to x(cond11)= ...保持不变。希望这有效。

这是一个错误,cond6不等于原始的第一个 else

cond2 = (w >= 0) & (v < -rhow-beta-1);
cond6 = (~cond2);
x(cond6) = (beta + 1 - v(cond6))/rho;

在原始中是:

if w(i) >= 0
   if v(i) < -rhow(i) – beta – 1
      ...
   else
      x(i) = (beta + 1 – v(i))/rho;  %this should be cond6
   end
end

应该像这样评估其他人(如果我没记错的话)

x(cond1) = (beta + 1 - v(cond6))/rho;

,然后在其他所有人之前到cond5。

我没有检查所有代码,因此,如果这没有解决您的问题,请告诉我。

相关内容

最新更新