有没有办法改进下面的代码?在更高的值下需要很多时间。如果建议改进的解决方案,我将不胜感激。
term3=0;
ngrain=70;
etas = rand(512*512,70);
glist = round(1,70);
en = zeros(1,70);
for i=1:70
en(i)=0.493;
end
for igrain=1:ngrain
for jgr=1:ngrain+nrex
if(glist(jgr)== 1)
den(igrain,jgr)=en(jgr)-en(igrain);
term3=term3-8/pi*(etas(:,igrain).*etas(:,jgr)).^0.5*den(igrain,jgr);
end
end
end
请以后更精确。以下是一些改进编码的提示:
用常量构建向量可以通过多种方式实现(不幸的是,你选择了效率最低的一种(:
- 一个 for 循环(有或没有预先分配内存,你确实分配了,所以这很好!
- 使用1* 常量 =>
ones(1,70)*0.493
- 重复 1x1 矩阵:repmat(( =>
repmat(1,70,0.493)
(这是最有效的方法,您可以使用tic()
和toc()
进行检查(
无论如何,这不是你的瓶颈。 您可以直接进行逻辑比较,而不是循环并使用 if:
lg = glist == 1;
idx = find(lg);
for i = 1:length(idx)
jgr = idx(i)
end
请注意,您的示例不起作用,因为未定义nrex
。如果您将代码格式化得更好(一致的间距、缩进、更直观的命名(,那也很棒(