【发布时间】:2021-02-14 03:19:06
【问题描述】:
我正在尝试加速 MATLAB 代码,该代码需要在 for 循环中访问大型矩阵 a 的一些术语 a(i,j)。在某些部分中,在五次或更多不同的计算中可能需要一项。在这些情况下,代码会将术语 a(i,j) 分配给另一个变量 k。
我认为这会产生不必要的分配(在五次计算的情况下),但令我惊讶的是,事实恰恰相反。实际上,这个赋值确实使代码运行得更快。访问五次大型矩阵的项比将其传递给标量变量并访问此标量变量五次要慢。
这些发现可以在一个简单的测试函数中重现:
r = 5e6;
i = 50;
j = 50000;
a = zeros(i,j);
%
tic
for ii = 1:r
b = a(i,j)+a(i,j)+a(i,j)+a(i,j)+a(i,j);
end
toc
%
tic
for ii = 1:r
k = a(i,j);
b = k+k+k+k+k;
end
toc
第一个代码比第二个代码花费的时间多 3.5 倍。
MATLAB 从 ~20 Mb 的矩阵中访问数据应该那么慢吗?
编辑 1:
按照 Cris Luengo 的回答,显然我正在使用的 MATLAB 安装存在问题 (R2019a)。之前的结果是通过一个M文件得到的。
以下代码生成output。好像根本没有编译。
r = 5e6;
i = 50;
j = 50000;
a = zeros(i,j);
aux_rgb = lines(2);
figure('Color','White','Name','Code with drawnow'); hold on;
legend('location','bestoutside'); ylim([0,1.05]);
xlabel('number of terms in summation');
ylabel('relative time spent');
h1 = animatedline(NaN,NaN,'LineWidth',2.5,'Color',aux_rgb(1,:),'DisplayName','a(i,j)');
h2 = animatedline(NaN,NaN,'LineWidth',2.5,'Color',aux_rgb(2,:),'DisplayName','k');
%%
n = 1;
t1 = tic;
for ii = 1:r
b = a(i,j);
end
t1 = toc(t1);
addpoints(h1,n,t1/t1);
t2 = tic;
for ii = 1:r
k = a(i,j);
b = k;
end
t2 = toc(t2);
addpoints(h2,n,t2/t1);
drawnow
%%
n = 2;
t1 = tic;
for ii = 1:r
b = a(i,j)+a(i,j);
end
t1 = toc(t1);
addpoints(h1,n,t1/t1);
t2 = tic;
for ii = 1:r
k = a(i,j);
b = k+k;
end
t2 = toc(t2);
addpoints(h2,n,t2/t1);
drawnow
%%
n = 3;
t1 = tic;
for ii = 1:r
b = a(i,j)+a(i,j)+a(i,j);
end
t1 = toc(t1);
addpoints(h1,n,t1/t1);
t2 = tic;
for ii = 1:r
k = a(i,j);
b = k+k+k;
end
t2 = toc(t2);
addpoints(h2,n,t2/t1);
drawnow
%%
n = 4;
t1 = tic;
for ii = 1:r
b = a(i,j)+a(i,j)+a(i,j)+a(i,j);
end
t1 = toc(t1);
addpoints(h1,n,t1/t1);
t2 = tic;
for ii = 1:r
k = a(i,j);
b = k+k+k+k;
end
t2 = toc(t2);
addpoints(h2,n,t2/t1);
drawnow
%%
n = 5;
t1 = tic;
for ii = 1:r
b = a(i,j)+a(i,j)+a(i,j)+a(i,j)+a(i,j);
end
t1 = toc(t1);
addpoints(h1,n,t1/t1);
t2 = tic;
for ii = 1:r
k = a(i,j);
b = k+k+k+k+k;
end
t2 = toc(t2);
addpoints(h2,n,t2/t1);
drawnow
编辑 2:
再次按照Cris Luengo的回答,就是通过M文件函数(不是M文件脚本)获得的output。现在编译完成了它的工作。
【问题讨论】:
标签: matlab matrix indexing interpreter