【发布时间】:2025-12-24 08:20:16
【问题描述】:
我手头有一个非常大的 Matlab 仿真项目,我想对其进行优化,因为我多次运行它来调整参数等。
使用 Matlab 的 profile 我发现了一个占用我大部分时间的函数,特别是 output(i,1)= max(mean(dens(i+1:a,1)),dens(i+1,1)); 这一行
此函数称为 LOT,其中 input 是作为参数传递的 10x1 double,output 也是 10x1 向量。
function output = my_function(input)
a = size(input,1);
output = input*0;
dens = density(input);
% for each i, output(i) is the maximum between output(i+1) and mean(output(i+1:end))
for i = 1:a-1
output(i,1)= max(mean(dens(i+1:a,1)),dens(i+1,1));
end
output(a,1) = dens(a,1);
end
我的想法:
- 我认为矢量化可能有助于摆脱循环 (?),但我对这项技术一点也不熟悉。
- 是否有更快/替代的方法来计算
mean(可能没有 Matlab 的内置函数调用?)
编辑 我尝试对函数进行矢量化,得到以下替代结果,它执行相同的操作:
function output = my_function_vectorized(input)
a = size(input,1);
rho_ref = zeros(size(input));
dens = density(input);
temp_cumsum = flip(cumsum(flip(dens))./(1:1:a)');
output = [max(temp_cumsum(2:end),dens(2:a));dens(a)];
end
我尝试通过以下方式测试这两个功能:
Ts = random('unif',40,80,10,1000);
Results_original = zeros(size(Ts));
Results_vectorized = zeros(size(Ts));
TIMES_original = zeros(size(Ts,2),1);
TIMES_vectorized = zeros(size(Ts,2),1);
for ii = 1:size(Ts,2)
tic;
Results_original(:,ii) = my_function(Ts(:,ii));
TIMES_original(ii) = toc;
end
for ii = 1:size(Ts,2)
tic;
Results_vectorized(:,ii) = my_function_vectorized(Ts(:,ii));
TIMES_vectorized(ii) = toc;
end
res = norm(Res_1 - Res_2);
mTIMES_original = mean(TIMES_original);
mTIMES_vectorized = mean(TIMES_vectorized);
我得到的:
res =
3.1815e-12
mTIMES_original/mTIMEZ_vectorized =
3.0279
- 这个残留物应该与我有关吗?
- 说我已经将这个计算提高了 3 倍是否正确?
【问题讨论】:
标签: performance matlab for-loop vectorization