2017-03-22 31 views
0

考慮函數:功能Matlab的生產零無緣無故

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我應該得到的東西非零。

回答

8

當使用logical數組作爲if語句的條件時,它將僅評估爲真if all elements of the array are trueand it is non-empty

當結果非空且只包含非零元素(邏輯或實數)時,表達式爲真。否則,表達式是錯誤的。

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; 
2

x和y不標量如此x > 0 & y > 0沒有標量,以及這就是爲什麼按照預期的,如果條件不工作。嘗試索引代替:

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));