Вы можете довольно легко векторизовать два внутренних цикла, вычисляя temp_result
и result
как матрицы вместо одного за раз.Например:
for eval_counter = 1:size(eval_points,2)
temp_result = sum(Z_func( eval_points(eval_counter) - historic_times + 1440*floor(historic_times/1440) - 1440*(0:1:T_max)', omega ));
results(eval_counter) = results(eval_counter) + sum(historic_weights.*temp_result);
end % End of looping over evaluation points
Это выполняется на моей машине ~ 9 секунд, по сравнению с 73 секундами для вашей зацикленной версии.
Теоретически вы можете сделать это без единого цикла,следующим образом:
eval_points = linspace(0,T_max,1000);
historic_weights = rand(100,1); % Note transposed from original
historic_times = rand(100,1);
eval_loop = reshape(0:T_max,1,1,[]); % size = [1,1,10000];
result = sum(historic_weight.*sum(Z_func(eval_points - historic_times + 1440*floor(historic_times/1440) - 1440*eval_loop, omega ),3),1);
Однако при этом будет использоваться значительный объем памяти (> 8 ГБ), и поэтому он может оказаться невозможным для вашей текущей ситуации.У меня недостаточно памяти на моей текущей машине, чтобы проверить это, поэтому я не знаю, насколько быстрее это будет работать, но теоретически это должно быть еще быстрее из-за отсутствия каких-либо циклов for в коде.