How to turn a function handle with 3 inputs (1 variable and 2 parameters) and then assign the inputs parameters and get a function handle with one input? ?
19 ビュー (過去 30 日間)
古いコメントを表示
Hello friends!
Consider the following
y=1;z=1;
f=@(x,y,z)x+y+z;
Now, I would like to create another function handle which is only a function of x. You migh suggest the following solution:
g=@(x)f(x,y,z);
but this is not what I want since I need to pass g(x) as input to another function and there I want to reduce the computational time. If I follow this solution whenever I call g, say g(1), it needs f, too plus that it does 3 arithmatics (3 sums) but I would like to have 2 arithmatics since g(x)=x+2.
Any idea?
7 件のコメント
Torsten
2022 年 1 月 14 日
But how do you think it can be possible to define a function handle for g without using the function handle for f if g is deduced from f in some way ? Sounds contradictory to me.
回答 (3 件)
Steven Lord
2022 年 1 月 14 日
Let's look at the actual time difference between the two approaches.
y=1;
z=1;
f=@(x,y,z)x+y+z;
g=@(x)f(x,y,z);
h = @(x) x+2;
timeit(@() g(42))
timeit(@() h(42))
Is this really the bottleneck in your code?
I realize that this was probably just a simple example to demonstrate what you're trying to do, so can you show the output of timeit called on a more "realistic" f, g, and h functions from your actual application?
3 件のコメント
Matt J
2022 年 1 月 15 日
編集済み: Matt J
2022 年 1 月 15 日
Yes, what steps did you take that led you to such a monstrous 100MB mathematical expression? It sounds as if you have done nothing at all to vectorize the operations in your equations, like for example if you had rewritten a large matrix/vector operation in terms of their individual scalar components.
I suggest you show us just the first 20 lines of the expression you're trying to evaluate, so we can get a sense of the problem.
Jeff Miller
2022 年 1 月 15 日
Not sure I understand the situation, but this sounds to me like a case where an OO approach could be very helpful. Consider:
classdef myFunc < handle
properties
ComputedFromYandZ
end
methods
function obj = myFunc() % Constructor
obj.ComputedFromYandZ = 0;
end
function [] = SetNewYandZ(obj,Y,Z) % Compute whatever depends on Y and Z
obj.ComputedFromYandZ = Y + Z;
end
function Result = ComputeFromX(obj,X) % Compute whatever depends on X with Y and Z fixed
Result = abs( X + obj.ComputedFromYandZ ) ;
% I included abs() here to make a function for fminsearch to
% minimize.
end
end
end
You can then use a function handle to a function that depends only on X (after setting Y and Z), something like this:
myF = myFunc;
myF.SetNewYandZ(2,3);
fminsearch(@myF.ComputeFromX,20)
% ans -5
myF.SetNewYandZ(-20,-30);
fminsearch(@myF.ComputeFromX,20)
% ans 50
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Symbolic Variables, Expressions, Functions, and Preferences についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!