Subroutine using if statement

조회 수: 1 (최근 30일)
Anna Lin
Anna Lin 2021년 6월 13일
댓글: Star Strider 2021년 6월 13일
What I'm trying to do is to supply different value of constant k at different x intervals. However, it seems that my y(x==3) is not equal to y_actual.
x=0:20;
k=X(x); %Subroutine func
y=k*x;
y_actual = (5+2)*3 % what i wanted
y(x==3)
function k=X(x)
if (x>=2)
w=5;
else
w=4;
end
k=w+2;
end
  댓글 수: 2
SALAH ALRABEEI
SALAH ALRABEEI 2021년 6월 13일
when u send X(x) which already conatins values <2, so the if will always go to the else (w=4)
Anna Lin
Anna Lin 2021년 6월 13일
I see. So I shouldn't pass x into the function X?

댓글을 달려면 로그인하십시오.

채택된 답변

Star Strider
Star Strider 2021년 6월 13일
I generally favour this sort of approach to such prolblems —
X = @(x) ((x>=2).*5 + (x<2).*4) + 2;
x = 0:20;
k = X(x);
y = k.*x;
figure
plot(x, y, '+-')
grid
xy = table(x(:),y(:), 'VariableNames',{'x','y'})
xy = 21×2 table
x y __ ___ 0 0 1 6 2 14 3 21 4 28 5 35 6 42 7 49 8 56 9 63 10 70 11 77 12 84 13 91 14 98 15 105
.
  댓글 수: 7
Anna Lin
Anna Lin 2021년 6월 13일
Thank you very very much!
Star Strider
Star Strider 2021년 6월 13일
As always, my pleasure!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Image Analyst
Image Analyst 2021년 6월 13일
Lots of stuff wrong with this. For starters, you're passing in the whole x vector into the (poorly-named) X function yet your function seems to be expecting only a single value of x, not a whole multi-element vector. Take the semicolons off the ends of the lines and you'll see exactly what it's doing, which is exactly what you told it. You said x==3 which gives a 21 element logical vector with false everywhere except at index 4 (where x has the value 3) and it's true there.
ans =
1×21 logical array
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
So then y(4) = 18 which is why it's giving you 18.
I'm not sure if you expect the k to be a vector or a scalar so I'm not sure how to tell you to fix it.
x=0:20
k=X(x) % Subroutine function
y=k*x
y_actual = (5+2)*3 % what i wanted
y(x==3)
function k=X(x)
if (x>=2)
w=5;
else
w=4;
end
k=w+2;
end
x =
Columns 1 through 20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Column 21
20
k =
6
y =
Columns 1 through 20
0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 114
Column 21
120
y_actual =
21
ans =
18
  댓글 수: 1
Anna Lin
Anna Lin 2021년 6월 13일
편집: Anna Lin 2021년 6월 13일
The k should be a vector.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Platform and License에 대해 자세히 알아보기

태그

제품


릴리스

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by