Defining function handles in a for loop
이전 댓글 표시
Hello everyone,
I have trying to define a series of function handles that are very similar. They only differ by their constant coefficients. They general idea is that I want to define functions s1 to s5 such that
for i =1:5
S_i = @(x) z(i)/3.*(p(i+1) -x)^3
end
where each s takes on their coefficeints from vectors z and p, as shown. But it seems like Matlab does not allow an array of function handles. What should I do?
Thanks a lot guys!
댓글 수: 1
Stephen23
2020년 11월 7일
"You can create an array of function handles by collecting them into a cell or structure array."
답변 (1개)
Walter Roberson
2020년 11월 7일
for i =1:5
S_i{i} = @(x) z(i)/3.*(p(i+1) -x)^3
end
댓글 수: 6
Yancheng Wang
2020년 11월 7일
Lets try it with some random data:
z = rand(1,5);
p = rand(1,6);
for i = 1:5
S{i} = @(x) z(i)/3.*(p(i+1) -x)^3;
end
Checking:
S{1}(3)
S{2}(3)
S{3}(3)
S{4}(3)
S{5}(3)
They don't look the same to me. Lets check one of them, say the fifth one:
z(5)/3.*(p(5+1) -3)^3
So far everything behaves exactly as expected.
Yancheng Wang
2020년 11월 7일
편집: Yancheng Wang
2020년 11월 7일
Anonymous functions "remember" certain values in their bodies. You can check this using the functions function (which as its documentation page states should not be used programmatically, just for debugging.)
n = 2;
f = @(x) x.^n
metadata = functions(f);
metadata.workspace{1}
Even if we change n in the workspace, the remembered value in f will not change.
n = 3;
metadata2 = functions(f);
metadata2.workspace{1}
Yancheng Wang
2020년 11월 7일
편집: Yancheng Wang
2020년 11월 7일
Walter Roberson
2020년 11월 8일
S_i{i} = @(x) z(i)/3.*(p(i+1) -x).^3 %notice .^ instead of ^
카테고리
도움말 센터 및 File Exchange에서 Programming에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!