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;