在我的Matlab程序中,有几个实例需要创建矩阵,其条目依赖于其索引,并对其执行矩阵向量运算。我想知道如何最有效地实现这一点。
例如,我需要加速以下操作:
选项2是最有效的。有没有更快的选项来执行这个操作?
更新:
我也尝试了Abhinav的选项。
因此,对于较小的N,选项2是最慢的,但对于更大的N,它变得最有效。可能是因为内存?能有人解释一下吗?
例如,我需要加速以下操作:
N = 1e4;
x = rand(N,1);
% Option 1
tic
I = 1:N;
J = 1:N;
S = zeros(N,N);
for i = 1:N
for j = 1:N
S(i,j) = (i+j)/(abs(i-j)+1);
end
end
a = x'*S*x
fprintf('Option 1 takes %.4f sec\n',toc)
clearvars -except x N
我尝试加快速度,因此我尝试了以下选项:
% Option 2
tic
I = 1:N;
J = 1:N;
Sx = zeros(N,1);
for i = 1:N
Srow_i = (i+J)./(abs(i-J)+1);
Sx(i)= Srow_i*x;
end
a = x'*Sx
fprintf('Option 2 takes %.4f sec\n',toc)
clearvars -except x N
并且
% Option 3
tic
I = 1:N;
J = 1:N;
S = bsxfun(@plus,I',J)./(abs(bsxfun(@minus,I',J))+1);
a = x'*S*x
fprintf('Option 3 takes %.4f sec\n',toc)
clearvars -except x N
同时(感谢其中一个答案)
% options 4
tic
[I , J] = meshgrid(1:N,1:N);
S = (I+J) ./ (abs(I-J) + 1);
a = x' * S * x;
fprintf('Option 4 takes %.4f sec\n',toc)
clearvars -except x N
选项2是最有效的。有没有更快的选项来执行这个操作?
更新:
我也尝试了Abhinav的选项。
% Option 5 using Tony's Trick
tic
i = 1:N;
j = (1:N)';
I = i(ones(N,1),:);
J = j(:,ones(N,1));
S = (I+J)./(abs(I-J)+1);
a = x'*S*x;
fprintf('Option 5 takes %.4f sec\n',toc)
clearvars -except x N
看起来最有效的程序取决于N的大小。对于不同的N,我得到以下输出:
N = 100:
Option 1 takes 0.00233 sec
Option 2 takes 0.00276 sec
Option 3 takes 0.00183 sec
Option 4 takes 0.00145 sec
Option 5 takes 0.00185 sec
N = 10000:
Option 1 takes 3.29824 sec
Option 2 takes 0.41597 sec
Option 3 takes 0.72224 sec
Option 4 takes 1.23450 sec
Option 5 takes 1.27717 sec
因此,对于较小的N,选项2是最慢的,但对于更大的N,它变得最有效。可能是因为内存?能有人解释一下吗?
a
的值感兴趣吗? - obchardon