2017-03-22 3 views
0

Betrachten Sie die Funktion:Funktion auf Matlab Null ohne ersichtlichen Grund Herstellung

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  

Doch wenn ich versuche, bumpfun(-10:.1:10,-10:.1:10) zu berechnen, ich 0, die seit dem für x > 0 & y > 0 machen keinen Sinn, ich ungleich Null etwas bekommen soll.

Antwort

8

Wenn ein logical Array als Bedingung für eine if Anweisung verwendet wird, wird es nur als wahr ausgewertet if all elements of the array are trueand it is non-empty.

Ein Ausdruck ist wahr, wenn das Ergebnis nicht leer ist und nur Elemente ungleich Null (logisch oder reell numerisch) enthält. Ansonsten ist der Ausdruck falsch.

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

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

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

In Ihrem Beispiel die Ausgabe von X > 0 & Y > 0 ist etwa die Hälfte true Werte und die Hälfte false Werte, die die if Ausdruck führt zu false und der else Block bewerten stattdessen ausgeführt.

Was Sie stattdessen tun möchten, ist X > 0 & Y > 0 zu verwenden, um eine logische Maske zu erstellen, die Sie dann verwenden können, um das Ergebnis zu bearbeiten.

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 und y sind nicht Skalare so x > 0 & y > 0 nicht so gut ist skalar und deshalb Sie, wenn die Bedingung nicht wie erwartet funktionieren. versuchen Sie es stattdessen:

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