【发布时间】:2016-04-14 09:21:06
【问题描述】:
我试图加速以下代码:
xdim=5560;
ydim=6945;
zdim=7;
Nexi=270250785;
Neyi=270260480;
kne=1;
for i=1:xdim
tic
for j=1:ydim
for k=1:zdim
if j<ydim
map_ey(j+(k-1)*(ydim-1)+(i-1)*(ydim-1)*zdim+Nexi)=kne;
kne=kne+1;
end
end
end
for j=1:ydim
for k=1:zdim
if k<zdim
map_ez(j+(k-1)*ydim+(i-1)*ydim*(zdim-1)+Nexi+Neyi)=kne;
kne=kne+1;
end
end
end
for j=1:ydim
for k=1:zdim
if i<xdim
map_ex(j+(k-1)*ydim+(i-1)*ydim*zdim)=kne;
kne=kne+1;
end
end
end
toc
end
从上面的代码可以看出,我使用了tic toc,我发现每个i值的每个循环迭代如下:
Elapsed time is 0.378693 seconds.
Elapsed time is 0.378163 seconds.
Elapsed time is 0.380865 seconds.
Elapsed time is 0.378316 seconds.
Elapsed time is 0.377940 seconds.
Elapsed time is 0.379100 seconds.
Elapsed time is 0.378394 seconds.
Elapsed time is 0.383894 seconds.
Elapsed time is 0.397466 seconds.
Elapsed time is 0.415835 seconds.
可以更快吗?请帮忙。提前致谢。
【问题讨论】:
-
你到底想做什么?你不是想达到
map_ex=reshape(permute(reshape((1:xdim*ydim*zdim)+2*xdim*ydim*zdim,[xdim ydim zdim]),[2 3 1]),[],1)或类似的东西(很多错误,等等,但你明白我的意思)?不幸的是,您的代码尽可能慢。我不想告诉你如何加速它:你应该用高效的 MATLAB 代码重写它。为此,您必须告诉我们您希望达到的目标。另外:map_ey和map_ez似乎包含了很多空虚:你确定吗? (也许我错了) -
好的,只有 一个 重要提示:预先分配您的变量,而不是一步一步地夸大它们:
map_ey=zeros(ydim-1+(zdim-1)*(ydim-1)+(xdim-1)*(ydim-1)*zdim+Nexi,1)等。仅此一项就可以显着提高速度,但是我支持我之前的评论。 -
嘿伙计,我只是想让它像你显示的 reshape() 命令一样矢量化表格,这可能吗?
-
我的意思是你上面的代码很难破译。你肯定有一些公式或概念,你用这个野兽编程。如果您告诉我们您真正想要实现的目标,即
map_ex等的确切外观(简单来说),我们可以提供帮助。
标签: matlab loops for-loop optimization vectorization