Alternatives for passing variables efficiently to anonymous function

Hello,
I have a function as shown below, where I need to solve a system of equations via fsolve in a large loop.
At every iteration within this loop, I am replacing three variables, stored as single-vector arrays, in my system of equations (my system of equations is written as an anonymous function f) and I cannot find a better way than doing so by bringing f to the loop as a string, replacing my numeric variables as strings, and then using str2fun before solving the problem.
This code is very efficient-critical as the single-vector arrays I have to substitute and solve are very large, perhaps >10^6 data points.
function [KinSol] = ResolveKin2(LDamperFL, LDamperFR, SteerRackTravel, f, opts)
x0 = rand(14,1);%<---
KinSol = nan(14,length(LDamperFL)); %<---
for i = 1:size(KinSol,2) %<---
LDamperFL_st = string(LDamperFL(i));
LDamperFR_st = string(LDamperFR(i));
SteerRackTravel_st = string(SteerRackTravel(i));
f = replace(f,["LDamperFL","LDamperFR","xSteerRack"], [LDamperFL_st, LDamperFR_st, SteerRackTravel_st]);
Sfun_R = str2func(f);
x0 = fsolve(Sfun_R, x0, opts);%<---
KinSol(:,i) = x0;%<---
end
end
I have been looking into the options shown here for Passing Extra Parameters, but I'm not being successful in my attempt.
Thanks in advance for your time and help.
Carlos

 採用された回答

Ameer Hamza
Ameer Hamza 2020 年 12 月 2 日
編集済み: Ameer Hamza 2020 年 12 月 2 日

0 投票

Don't bring 'f' as string. Define it as function handle. For example, define f like this
f = @(x, LDamperFL, LDamperFR, xSteerRack) ........
and change the code to something like this
function [KinSol] = ResolveKin2(LDamperFL, LDamperFR, SteerRackTravel, f, opts)
x0 = rand(14,1);%<---
KinSol = nan(14,length(LDamperFL)); %<---
for i = 1:size(KinSol,2) %<---
x0 = fsolve(@(x) f(x,LDamperFL(i),LDamperFR(i),SteerRackTravel(i)), x0, opts);%<---
KinSol(:,i) = x0;%<---
end
end

6 件のコメント

Carlos Acasuso
Carlos Acasuso 2020 年 12 月 2 日
Thanks Ameer, that works quite well and is simple and neat.
I am surprised, however, that for a for loop of 1000 iterations, my first code above takes around 1.2s, whereas on the alternative method you've suggested it takes around 2s.
I would have expected it to be more efficient!
Thanks for yoru help anyway, very helpful.
Ameer Hamza
Ameer Hamza 2020 年 12 月 2 日
That is a bit surprising, but can you sure if your code is working correctly. For example, if you are exactly using the code in your question, then after first iteration, the following line will overwrite 'f'
f = replace(f,["LDamperFL","LDamperFR","xSteerRack"], [LDamperFL_st, LDamperFR_st, SteerRackTravel_st]);
it will replace LDamperFL, LDamperFR, and xSteerRack. Then in all the other iteration, replace do nothing. Are you getting same solution for 1000 iterations in your code?
Carlos Acasuso
Carlos Acasuso 2020 年 12 月 2 日
Oh you are correct Ameer, it is generating the same solution for every loop iteration.
Do you know why is this the case?
Then I definitely have to go away from my previous method.
Ameer Hamza
Ameer Hamza 2020 年 12 月 2 日
編集済み: Ameer Hamza 2020 年 12 月 2 日
In your original code change the lines to
f_ = replace(f,["LDamperFL","LDamperFR","xSteerRack"], [LDamperFL_st, LDamperFR_st, SteerRackTravel_st]);
Sfun_R = str2func(f_);
This will prevent overwriting ‘f’. See the timing again. Is it still faster?
Carlos Acasuso
Carlos Acasuso 2020 年 12 月 2 日
I understand now what was occuring. After the first iteration of the loop, 'f' got overwritten, the variables no longer exist there, hence they're not replaced anymore everafter.
After correcting this to not overwrite 'f', the code takes a very long time of 67s for 1000 iterations.
So now, your code is definitely the best choice and most efficient, thank you very much!
Ameer Hamza
Ameer Hamza 2020 年 12 月 3 日
I am glad to be of help! :)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeVariables についてさらに検索

製品

リリース

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by