How can I create multiple function handles in a for loop?

조회 수: 8 (최근 30일)
Carles
Carles 2025년 3월 7일
댓글: Carles 2025년 3월 10일
Hello to everyone!
I am trying to create multiple function handles with a for loop. For example:
mymat = 1:10;
for t = 1:length(mymat)
fun_t = (@) x^2-mymat(t)*x+mymat(t);
end
I would like to have 10 function handles like:
fun_1 = (@) x^2-1*x+1
...
fun_10 = (@) x^2-10*x+10
How can I do this? Would it be more convenient to use a matrix or an array with all the functions together?
Thank you very much and have a nice weekend!
  댓글 수: 2
Stephen23
Stephen23 2025년 3월 7일
편집: Stephen23 2025년 3월 7일
"I would like to have 10 function handles like"
You might "like to have" them all named like that, but that would be very bad data design:
"Would it be more convenient to use a matrix or an array with all the functions together?"
Yes, it would be much more convenient. It would also be much more efficient, easier to debug, etc.
For example, use a cell array to store them:
But why are you creating lots and lots of separate functions like that, when you could create one that operates on the entire matrix at once? It seems like something that would be better implemented as one function.
What are you actually trying to achieve?
Carles
Carles 2025년 3월 10일
편집: Carles 2025년 3월 10일
Hi Stephen. I have a histogram such as the one attached below, and I have done spline interpolation for the value of every bin at the center of it (in green).
I would like to know the area under the spline. If I have that F is the spline, then I can get the coefficients of the 3rd degree polynomials with F.coefs. However, the coefficients are defined as a matrix length(X_values)-1 x 4.
F = spline(X values, Y values);
polynoms = F.coefs;
My idea was to define length(X_values)-1 function handles to calculate afterwards the value of the integral in the whole domain, in that case:
fun_1 = @(x) polynoms(1,1)*x^3+polynoms(1,2)*x^2+polynoms(1,3)*x+polynoms(1,4)
...
fun_n = @(x) polynoms(n,1)*x^3+polynoms(n,2)*x^2+polynoms(n,3)*x+polynoms(n,4)
Area_1 = integral(fun_1, x_1, x_2)
...
Area_n = integral(fun_n, x_n, x_n+1)
sum(Area_1, ..., Area_n)
But I guess this is not the most appropiate approach. Any suggestions?

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

채택된 답변

Stephen23
Stephen23 2025년 3월 10일
편집: Stephen23 2025년 3월 10일
"I would like to know the area under the spline... But I guess this is not the most appropiate approach. Any suggestions?"
Use FNINT and FNVAL from the Curve-Fitting toolbox. I will assume that you have defined the end points of spline to be y=0 (otherwise you need to locate the x-axis intercepts using e.g. root finding... OR otherwise define the ends of your spline in a way that suits your problem).
y = [0,rand(1,5),0];
x = 1:numel(y);
pp = spline(x,y);
fnplt(pp)
fn = fnint(pp);
A0 = fnval(fn,x(end)) - fnval(fn,x(1))
A0 = 4.2455
If you do not have the Curve-Fitting toolbox, then here are some alternative approaches:
xx = linspace(x(1),x(end), 1e4);
yy = ppval(pp,xx);
At = trapz(xx,yy)
At = 4.2455
Ai = integral(@(x) ppval(pp,x), x(1),x(end))
Ai = 4.2455
  댓글 수: 1
Carles
Carles 2025년 3월 10일
Yes, that was what I was actually looking for. Thank you!

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

추가 답변 (2개)

Matt J
Matt J 2025년 3월 7일
편집: Matt J 2025년 3월 7일
The best would be to just have a matrix-valued function,
fun=@(x) x.^2-mymat(:).*x+mymat(:)
but you could make a cell array of scalar functions as well,
for t = 1:length(mymat)
c=mymat(t);
fun{t} = @(x) x^2-c*x+c;
end

Diego Caro
Diego Caro 2025년 3월 10일
Store your function handles in a cell array.
my_mat = 1:10;
my_handles = cell(size(my_mat));
for t = 1:length(my_mat)
my_handles{t} = @(x) x.^2 - my_mat(t).*x + my_mat(t);
end
  댓글 수: 1
Matt J
Matt J 2025년 3월 10일
Note that I already gave this as part of my answer 3 days ago. Also, it is not efficient to define the functions with the syntax,
@(x) x.^2 - my_mat(t).*x + my_mat(t);
because this causes the function handle to store the entire array my_mat which is not needed. It is for this reason that I extracted my_mat(t) to a separate variable,
c=mymat(t);
fun{t} = @(x) x^2-c*x+c;

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

카테고리

Help CenterFile Exchange에서 Spline Postprocessing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by