MATLAB: Does this code output all values as 1

elseififloop

Hi there, I'm trying to program a piecewise geometric function into matlab:
I have written the code as follows. If anybody can explain why the output (Sij) always equals 1 when I run this it would be helpful. The input "rrup" is just a bunch of random distance values ranging from 0 to 1000 (km).
decay0 = 1.0;
decay1 = 0.0;
decay2 = 2.22;
r0 = 50;
r1 = 50;
r2 = 150;
r = rrup;
for i = 1:length(r)
if r(i)<r0
Sij = (r0/r(i)).^decay0
elseif r1<=r(i)<=r2
Sij=(r1/r(i)).^decay1
elseif r(i)>r2
Sij =(r2/r(i)).^decay2
end
end

Best Answer

elseif r1<=r(i)<=r2
This will not do, what you expect. Matlab processes the expression from left to right. The first part is:
r1 <= r(i)
This is either true or false, which is converted to 1 or 0. Because r2 is 150, both values reply true for the second comparison:
(r1 <= r(i)) <= r2
You mean:
elseif r1 <= r(i) && r(i) <= r2
Now consider that you overwrite Sij in each iteration. So you get the last value as output only. Maxbe you want a vector instead? This will work easier without a loop:
decay0 = 1.0;
decay1 = 0.0;
decay2 = 2.22;
r0 = 50;
r1 = 50;
r2 = 150;
r = rrup;
S = nan(size(r));
index = (r < r0);
S(index) = (r0 ./ r) .^ decay0;
index = (r1 <= r & r <= r2);
S(index) = (r1 ./ r) .^ decay1;
index = (r > r2);
S(index) = (r2 ./ r) .^ decay2;