gpt4 book ai didi

matlab - 在 Matlab/Python 中向量化多个 for 循环

转载 作者:行者123 更新时间:2023-12-02 09:06:19 25 4
gpt4 key购买 nike

我正在尝试编写一个数学模型,它涉及在值网格上计算特定数量数千次,并使用一些变化的模型参数。目前,这太慢了,我正在寻求有关矢量化模型最密集部分的建议。

为了便于阅读,我目前已经有了它的基本实现,但现在希望如果可能的话对下面的整个代码段进行矢量化。代码段的最小示例是:

% Setup grid to evaluate and results vector
T_max = 10000;
eval_points = linspace(0, T_max, 1000);
results = zeros(size(eval_points));
% Function that is used in computation
Z_func = @(x, omega) (1./(omega.*sqrt(2*pi))).*exp( -(x.^2)./(2.*omega.*omega) );
% Random data for now, known in full problem
historic_weights = rand(1,100);
historic_times = rand(1,100);
% Fixed single parameter omega
omega = 0.5;
% Time evaluation
tic()
for eval_counter = 1:size(eval_points,2)
for historic_counter = 1:size(historic_weights,2)
temp_result = 0;
for k = 0:1:T_max
temp_result = temp_result + Z_func( eval_points(eval_counter) - historic_times(historic_counter) + 1440*floor(historic_times(historic_counter)/1440) - 1440*k, omega );
end % End of looping over k
results(eval_counter) = results(eval_counter) + historic_weights(historic_counter)*temp_result;
end % End of looping over weights
end % End of looping over evaluation points
toc()

在我的计算机上,评估只花了 60 秒多一点。我不想使用并行工具箱,因为我已经在其他地方使用它,并且在每个进程上都会调用显示的代码段。

如果这在 Matlab 中不可能,我很乐意在 Python 中尝试。

最佳答案

通过将 temp_resultresult 作为矩阵而不是一次计算一个,您可以相当轻松地对内部两个循环进行矢量化。例如:

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 GB),因此对于您当前的情况可能不可行。我当前的机器上没有足够的内存来测试它,所以我不知道它的运行速度有多快,但理论上它应该更快,因为代码中缺少任何 for 循环。

关于matlab - 在 Matlab/Python 中向量化多个 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58027274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com