Matlab上的函数没有明显的原因产生零

时间:2017-03-22 17:53:24

标签: matlab math

考虑一下这个功能:

function R = bumpfun(x,y)
if x > 0 & y > 0
   R = (exp(-1./x.^2)).*(exp(-1./(1-x).^2)).*(exp(-1./y.^2)).*(exp(-1./(1-y).^2));
else
   R = 0;
end     

然而,当我尝试计算bumpfun(-10:.1:10,-10:.1:10)时,我得到0,这没有任何意义,因为x > 0 & y > 0我应该得到非零的东西。

2 个答案:

答案 0 :(得分:8)

使用logical数组作为if语句的条件时,它只会计算为真if all elements of the array are true and it is non-empty

  

当结果为非空并且仅包含非零元素(逻辑或实数)时,表达式为true。否则,表达式为false。

if [true false]
    disp('Will not run')
end

if [true true]
    disp('Will run')
end

if [false false]
    disp('Will not run')
end

在您的示例中,X > 0 & Y > 0的输出大约有一半true值和一半false值,这导致if表达式计算为false和而是执行else块。

您要做的是使用X > 0 & Y > 0创建一个逻辑掩码,然后您可以使用它来操作结果。

mask = x > 0 & y > 0;
R = (exp(-1./x.^2)).*(exp(-1./(1-x).^2)).*(exp(-1./y.^2)).*(exp(-1./(1-y).^2));
R(~mask) = 0;

答案 1 :(得分:2)

x和y不是标量,因此x > 0 & y > 0也不是标量,这就是为什么if条件不能按预期工作的原因。尝试索引:

function R = bumpfun(x,y)

R = zeros(size(x));
nzIdxs = x > 0 & y > 0;
x = x(nzIdxs);
y = y(nzIdxs);
R(nzIdxs) = (exp(-1./x.^2)).*(exp(-1./(1-x).^2)).*(exp(-1./y.^2)).*(exp(-1./(1-y).^2));