matlab中如何将六重for循环进行优化.里面还包含if条件。
mip版 关注:176 答案:3 悬赏:70
解决时间 2021-01-25 04:29
已解决
2021-01-24 20:32
for ix=1:N+1
x=-1000+(ix-1)*2000/N;
for iy=1:N+1
y=-1000+(iy-1)*2000/N;
Lx(ix,iy)=x;
Ly(ix,iy)=y;
Exx(ix,iy)=0;
Exy(ix,iy)=0;
iip=0;
iiq=0;
for p= -(N-1)/2:(N-1)/2
iip=iip+1;
for q= -(N-1)/2:(N-1)/2
if sqrt(p^2+q^2)>(N-1)/2
continue;
end
iiq=iiq+1;
sitao=asin(2*NA*sqrt(p^2+q^2)/(N-1));
fano=atan2(q,p);
Eopqx(iip,iiq)=0;
Eopqy(iip,iiq)=0;
for m=-(N-1)/2: (N-1)/2
for n=-(N-1)/2: (N-1)/2
if sqrt(m^2+n^2)>(N-1)/2
continue;
end
sitai=asin (2*NA*sqrt(m^2+n^2)/(N-1));
fani=atan2(n,m);
。。。。。。。。。。。。。。。
运行速度超级慢,20个数要2个多小时。详细内容请看:http://www.ilovematlab.cn/thread-282036-1-1.html
最佳答案
2021-01-24 21:40
建议利用并行计算,速度至少提高1/3,只需要for循环中各次迭代之间无数据传递关系。做法简单:
只需要将你程序中的for更改为parfor即可,但前面需要加入如下指令:
matlabpool open
记得别忘记了程序最后添加:
matlabpool close
具体更改与不更改之间运算速度对比示例如下:
clc;
clear;
tic
for i=1:1000
c(:,i) = eig(rand(100));
end
display('Single CPU:')
toc
% use PCT
clear
matlabpool open local 2
tic
parfor i=1:1000
c(:,i) = eig(rand(100));
end
display('Double Core:')
toc
matlabpool close
全部回答
1楼
2021-01-24 23:47
n=1e6;
paradata =50;
nco_acc=zeros(n);
for i=2:n
nco_acc(i)=nco_acc(i-1)+paradata;
nco_acc(i)=mod(nco_acc(i),2^33);
end nco_acc=zeros(n);提前指定变量大小,能显著提高循环速度。不用随机寻址。并且你这个变量的第一个元素是什么需要指定。
2楼
2021-01-24 22:23
1 直接使用数组进行计算,可以快4~5倍的时间
2 删去无意义的if,拟程序中的if没进行任何动作,完全可以删除
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
点此我要举报以上信息!
推荐资讯
大家都在看