【问题标题】:Errors in Vectorized For-loop Matlab Code矢量化 For 循环 Matlab 代码中的错误
【发布时间】:2015-05-10 04:41:43
【问题描述】:

我有一个要矢量化的 for 循环代码。下面是最初的 for 循环代码,以及代码的矢量化版本。矢量化代码的结果与 parfor 循环的结果不同,因此我知道代码有问题。如果论坛的任何成员可以帮助我查看矢量化代码并查看他们是否可以向我指出我的错误,我将不胜感激。提前谢谢你。

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

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;

【问题讨论】:

    标签: matlab if-statement for-loop parfor


    【解决方案1】:

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

    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)=... 到 x(cond11)=... 保持不变。 希望这行得通。

    【讨论】:

      【解决方案2】:

      这里有个错误,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
      

      else应该这样评价(如果我没记错的话)

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

      在 cond5 之前的所有其他人之前。

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

      【讨论】:

      • 感谢您的帮助。但我不确定你所说的“在所有其他人之前到 cond5”是什么意思。但我试图实现我从你所说的内容中理解的内容,但我仍然遇到错误。 cond1 = (w >= 0); cond2 = (cond1) & (v
      • 我的意思是应该首先评估这个条件,在 x(cond2) 到 x(cond5) 之前。如果您在其中任何一个之后执行此操作,x(cond1) 将覆盖它们。
      猜你喜欢
      • 2014-09-25
      • 2011-11-26
      • 2017-01-04
      • 2015-02-03
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多