【问题标题】:Remove IF-ELSE conditional statements and Vectorization删除 IF-ELSE 条件语句和向量化
【发布时间】:2023-03-20 06:50:02
【问题描述】:

我需要使用 feval 来评估值向量上的函数。函数定义为:

function v = s(x,y)
if y>=0.5
    if (-2*(x-3/4)+(y-1/2))<0
        v=-0.5;
    else
        v=1.5;
    end
else
    v=max( -0.5,min( 1.5,(x-3./4)/(y-1./2) ) );
end
end

以下解决方案不起作用:

function v = s(x,y)
ind1=(y>=0.5); 
ind2=(-2*(x(ind1)-3/4)+(y(ind1)-1/2)<0);
ind3=(-2*(x(ind1)-3/4)+(y(ind1)-1/2)>=0);
v(ind2)=-0.5;
v(ind3)=1.5;
v(~ind1)=max( -0.5,min( 1.5,(x(~ind1)-3./4)/(y(~ind1)-1./2) ) );
end

确实,有:

p(1,:)=[2 3 4 5];
p(2,:)=[1 0 7 8];
hs=@s;
f=feval(hs, p(1,:), p(2,:));

我得到 f=

-0.500000000000000  -0.500000000000000  -0.500000000000000

而不是 4 值向量。

【问题讨论】:

  • 你不是说删除IFs而不是向量化它们吗?那些x 和y 是向量吗?即便如此,您的第一种方法看起来已经矢量化了。
  • 是的,我需要删除 if 以使用矢量化。但是上面的解决方案不起作用。
  • 下面的解决方案怎么样? huEx 到底是什么?看起来可能是函数s。
  • 对不起,它是 s 的句柄。已更正。

标签: matlab vector indexing vectorization


【解决方案1】:

看看这种逻辑索引方法是否适合你 -

function v = s(x,y)

cond1 = y>=0.5;
cond2 = (-2*(x-3/4)+(y-1/2))<0;

val = max( -0.5,min( 1.5,(x-3./4)./(y-1./2) ) );
v = -0.5.*(cond1&cond2) + 1.5.*(cond1&~cond2) + ~cond1.*val;

return;

【讨论】:

  • 你没有使用我希望的核代码。尝试时可能会受伤 :) 是的,它应该可以工作,我用我认为的标量值进行了测试。
  • 它只是一个原型,它只会“虚拟”爆炸!
  • @Gonzague 解决了这个问题!现在应该可以工作了。给我-0.5000 0.5303 1.5000 -0.5000 作为您的示例输入。
  • @Gonzague 等待您的更新,您将在其中放置正确的值。
  • 为什么不用这些输出来编辑你的问题呢?你可以参考我的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 2021-11-30
  • 2014-03-30
  • 2023-02-06
相关资源
最近更新 更多