矢量化Elseif循环

阿曼达

我正在努力向量化这个parfor循环。我想从代码中完全删除parfor循环,因为n很大时要花很长时间才能执行。请查看下面粘贴的代码。我将不胜感激任何提示/建议/帮助这个论坛中的任何人都可以在此给我。提前谢谢了。

% Initialization and precomputations
% w is an n x 1 vector
% beta: any number larger than 0. Usually set to 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
end

更新:非常感谢Hbderts的回答,这对我很有帮助。这就是我最终想出的。我仍然出错了,因为当我插入变量的值时,无法获得与parfor循环相同的预期结果。您能帮我看看吗,让我知道我错了吗?提前谢谢了。

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帮助页面中所述。让我们举一个简单的例子:

A = [1 2 3 4];
ind = logical([0 1 0 1]);
B = A(ind)

B = 
  2    4

您可以使用该系统对所有不同情况进行建模,并放置for循环。对于第一种情况,那将是

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

让我们x((w>=0)&(v<-rhow-beta-1))详细了解一下该术语

  • w>=0创建包含一个逻辑矢量1(真),如果在相应的条目w>=00(假)否则。
  • v<-rhow-beta-1 还创建一个逻辑向量,其中包含true或false。
  • &这些术语之间是逻辑AND。有了这个,我们有一个向量,其中包含满足两个条件的所有元素的值为true,否则为false。
  • 使用x(...),我们从中获得x满足上述两个条件的所有元素

现在,我们已经有了第一步要设置的所有元素。现在,我们必须创建将其设置为的值。该部分(-beta-1-v(...))/rho与以前相同。随着v(...)哪里...都一样的条件之前,我们把所有相关v的,做计算与它们并将它们保存在正确的位置x

我们可以对您拥有的所有if-then-else子句重复此过程。对于第二个,这将是

x((w>=0) & (-rhow–beta–1<=v) & (v<=-rhow+beta–1)) = ...
    w((w>=0) & (-rhow-beta-1<=v) & (v<=-rhow+beta-1));

等等...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章