24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1973  |  回复: 9
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

ll20100996

禁虫 (知名作家)

本帖内容被屏蔽

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   关注TA 给TA发消息 送TA红花 TA的回帖

superstat54

木虫 (小有名气)

【答案】应助回帖

ll20100996(金币+2): 我用fortran编了,快一倍。呵呵 2011-06-22 08:56:39
高效的Matlab程序,尽量避免使用循环语句,更多的采用向量化的编程方式,即使用矩阵。修改如下:
clear;
tic
N=10;tn=4E4;a=3.905E-10;b=3.905E-10;c=4.2E-10;K0=0; n3=4-1;
            for n1=1:tn
                n2=1:n1-1;
                K01=2*a*b*c*(3*n3^2*c^2./(n1^2*a^2+n2.^2*b^2+n3^2*c^2)-1)./((n1^2*a^2+n2.^2*b^2+n3^2*c^2).^1.5*2*pi*8.85E-12);
                K0 = K0 - sum(K01);
                K0=K0-a*b*c*(3*n3^2*c^2/(n1^2*a^2+n1^2*b^2+n3^2*c^2)-1)/((n1^2*a^2+n1^2*b^2+n3^2*c^2).^1.5*2*pi*8.85E-12);
            end
            n1=1:tn;
            K02=a*b*c*(3*n3^2*c^2./(n1.^2*a^2+n3^2*c^2)-1)./((n1.^2*a^2+n3^2*c^2).^1.5*2*pi*8.85E-12);%n2=0 Or b=0
            K0 = K0 - sum(K02);
            K0=K0-a*b*c*(3*n3^2*c^2/(n3^2*c^2)-1)/((n3^2*c^2)^1.5*8*pi*8.85E-12)
toc;
对比:
tn=4E3,
原程序:
时间:2.550174 seconds,K0=-6.8388e+006;
修改后,时间:2.190174 seconds,K0=-6.8388e+006;

tn=4E4,
原程序,运行N久,没有等到结果就放弃了
修改后,时间155 s, K0 = -6.85e+005
tn=4E5时,你自己尝试一下吧,运行时间估计随tn成平方关系增长。
7楼2011-06-21 23:55:42
已阅   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 10 个回答

锐利的碎片

木虫 (正式写手)

star watcher

【答案】应助回帖


ll20100996(金币+1): 我试过,可是数组太大,电脑不支持啊!~还是谢谢啦! 2011-06-15 12:05:03
dubo(金币+1): 欢迎常来程序语言版讨论 2011-06-15 23:10:34
matlab循环很慢,fortran相比要快得多。可以考虑把循环拆开换成数组运算,会有一定提高。
2楼2011-06-15 11:18:17
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

yalefield

金虫 (文坛精英)

老汉一枚

【答案】应助回帖


ll20100996(金币+1): 我会考虑下你的建议。可是我的C基础不好,如何并行化也不清楚啊!能否具体说下呢?非常感谢! 2011-06-15 12:06:23
jjdg(金币+1): 感谢支招 2011-06-15 12:18:50
用C重写,而且这段代码可以很大程度地并行化咯。
嗯,提高1024倍没问题咯。
3楼2011-06-15 11:41:33
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

coolrainbow

木虫 (著名写手)

未来国家冻凉


jjdg(金币+1): 感谢支招 2011-06-15 12:19:01
改成C后,把^2 改成*,然后用openmp来并行下,很简单的
技术博客:http://hi.baidu.com/coolrainbow/blog
4楼2011-06-15 12:10:21
已阅   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见