How to speed up this calculation and remove loop(s)?

Hello,
I have a table oFD that 10450x27 in size. I am trying to optimize this double loop to speed up the processing. For whatever reason, I'm drawing a blank how to optimize and am sure if can be computed more efficiently.
sPs = [3500:5000]';
CGE = zeros(size(sPs,1),1);
for row = 1:size(oFD,1)
for m = 1:size(sPs,1)
CG = my_function(sPs(m),oFD.PS(row),oFD.dTE(row),oFD.CIV(row));
CG2(row,m) = oFD.COI(row)*sPs(m)^2*CG;
end
end
Would someone please be able to help?
Thank you in advance!

3 comentarios

James Tursa
James Tursa el 29 de Sept. de 2022
This is going to depend largely on what my_function( ) does and whether it is or can be vectorized. You will need to show us the my_function( ) code.
What is size(oFD,1) and size(sPs,1)? Unless they're tens of millions, your bottleneck may not be the loop iteration itself but something inside the loop. If the total number of iterations is like a few hundred thousand, you're only talking about microseconds for the looping overhead.
Sorry for the late reply, had to attend to same family matters yesterday afternoon.
size(oFD,1) = 10500x27
size(sPs,1) = 1797x1

Iniciar sesión para comentar.

 Respuesta aceptada

Jan
Jan el 29 de Sept. de 2022
There is a very small potential for optimizing in the posted code:
for row = 1:size(oFD,1)
c1 = oFD.PS(row);
c2 = oFD.dTE(row);
c3 = oFD.CIV(row);
c4 = oFD.COI(row);
for m = 1:size(sPs,1)
CG = my_function(sPs(m), c1, c2, c3);
CG2(row,m) = c4 * sPs(m)^2 * CG;
end
end
I assume, the main time is spent in my_function. The profiler would reveal this.
If you post the code of my_function, further improvements are possible.

5 comentarios

Daulton_Benesuave
Daulton_Benesuave el 29 de Sept. de 2022
Movida: James Tursa el 29 de Sept. de 2022
Hi Jan,
Thanks for the very quick reply!
my_function is simply a modified version of the builtin Matlab function 'blsgamma'.
blsgamma has a one extra input 'rate' than can be assumed to be 0 for my_function.
Do this help you optimize further?
blsgamma is already vectorized, so you do not need a for loop even if you have a matrix of current stock prices and corresponding excercise prices.
E.g. if
S0 = MxN matrix of stock prices
X = MxN matrix of excercise prices
etc.
just call this with G = blsgamma(S0, X, ....)
There is no need to iterate with a for loop, this should be faster.
Don't think it matters, Daulton's custom function is blsgamma which is already vectorized...
I do not have the Financial Toolbox. So this is a dumb guess only:
for row = 1:size(oFD,1)
c1 = oFD.PS(row);
c2 = oFD.dTE(row);
c3 = oFD.CIV(row);
c4 = oFD.COI(row);
CG = my_function(sPs, c1, c2, c3);
CG2(row, :) = c4 * sPs.^2 .* CG;
end
So can you call my_function with a vector as 1st input?

Iniciar sesión para comentar.

Más respuestas (0)

Productos

Versión

R2020a

Preguntada:

el 29 de Sept. de 2022

Comentada:

el 30 de Sept. de 2022

Community Treasure Hunt

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

Start Hunting!

Translated by