考虑一下这个功能:
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
我应该得到非零的东西。
答案 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));