主题:jstzhurj老师,我又将程序简化了,能否看下?
tianhy2010
[专家分:60] 发布于 2010-08-28 22:18:00
还是上次那代码。我想了下,由于相邻的两个特征值之间可能有好几个p,比如在eigenvalue(4)和eigenvalue(5)之间有8个p,分别是23、24、25、。。。、30,他们的conr值相同,我只要算一个就可以了,然后把这个值赋给其他的conr,比如得到了conr(23),可以把conr(23)直接赋给conr(24、25、26、...、30),这样就不用再重复计算了,我改了下程序,帮忙看下吧?呵呵
q=1
do i=1,4*m*n-1 !每个i找满足的p,先对i循环
conduc=0.0
k=0
do p=q,450000
if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then !如果p满足条件,就执行下面的操作,再看下满足这个条件的p有几个
q=p+1 !p+1看下还能否满足条件,如果能那就k+1,直到不能满足条件跳出if语句
k=k+1 !计算总的能满足i条件的p的个数
end if
do temp=1,i
do j=i+1,4*m*n
ea=matmul(traneigv(temp,:),hx)
ec=matmul(traneigv(temp,:),hy)
eb=matmul(traneigv(j,:),hx)
ed=matmul(traneigv(j,:),hy)
conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))
end do
end do
conr(p)=2*pi*aimag(conduc)/S
!将能满足i条件的所有conr(p)都赋值,如果k>1,那就说明不止一个能满足条件了
if(k>1) then
do ii=1,k
conr(p+ii)=conr(p)
end do
end if
q=p
exit !退到计算下一个i的地方
end do
end do
最后更新于:2010-08-30 22:21:00
回复列表 (共58个回复)
51 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 20:42:00
这样不行吗?
q=1
do i=1,450000-1
do j=q,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
else
q=j
if(ds(i)>=0) then
exit
end if
end if
end do
end do
问:杯具啊! ,如果i=1,j=1,2,3...4*m*n都不满足,按你的程序q就等于4*m*n(else不满足给q赋值!)!退出的时候,下次j=4*m*n,4*m*n,j<4*m*n的就没机会啦!!
[em6][em6][em6][em15][em15][em15][em20][em20][em20][em55][em55][em55][em74][em74][em74]
答:如果i=1,j=1不满足,那就把j的值赋给q,ds(1)=0。下面检查满足if 条件不,满足了,那就不再朝下检查了,exit。
大姐啊,是这样吗?[em21][em21][em21][em21][em21][em21][em21][em21][em21]我快疯啦
52 楼
jstzhurj [专家分:4680] 发布于 2010-08-31 20:51:00
[quote]
这样不行吗?
q=1
do i=1,450000-1
do j=q,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
else
q=j
if(ds(i)>=0) then
exit
end if
end if
end do
end do
问:杯具啊! ,如果i=1,j=1,2,3...4*m*n都不满足,按你的程序q就等于4*m*n(else不满足给q赋值!)!退出的时候,下次j=4*m*n,4*m*n,j<4*m*n的就没机会啦!!
[em6][em6][em6][em15][em15][em15][em20][em20][em20][em55][em55][em55][em74][em74][em74]
答:如果i=1,j=1不满足,那就把j的值赋给q,ds(1)=0。下面检查满足if 条件不,满足了,那就不再朝下检查了,exit。
大姐啊,是这样吗?[em21][em21][em21][em21][em21][em21][em21][em21][em21]我快疯啦[/quote]
看来你是分析不出来啦哎![em1]把q=j放在exit前面,if(ds(i)>=0) 里面,在运行程序,比较两者结果的差别!!别看程序上这一点点差别,结果差远啦!
再把结果和不考虑效率容易理解的程序比较一下:
do i=1,450000-1
do j=1,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
end if
end do
end do
不知能否明白个中道理?[em18][em5][em8][em12]
53 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 21:08:00
[em45][em45][em45][em45][em46][em46][em46][em46][em69][em69][em69][em69][em69]
貌似明白了,对于不考虑效率的程序,每个j都要循环一次,浪费时间,但是对于
q=1
do i=1,450000-1
do j=q,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
else
if(ds(i)>=0) then
q=j
exit
end if
end if
end do
end do
只要j不满足i条件,就判断下是否ds(i)>=0,如果是的话让q=j进行下一个i循环。[em68][em68][em58][em58][em58][em45][em45][em45][em21][em21][em11][em11][em12][em12]我一直是这么想的[em8][em8][em8][em8][em8][em8][em8][em8][em8]
54 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 21:14:00
你水平好高啊!!高深莫测!!佩服啊
55 楼
jstzhurj [专家分:4680] 发布于 2010-08-31 21:15:00
[quote]
[em45][em45][em45][em45][em46][em46][em46][em46][em69][em69][em69][em69][em69]
貌似明白了,对于不考虑效率的程序,每个j都要循环一次,浪费时间,但是对于
q=1
do i=1,450000-1
do j=q,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
else
if(ds(i)>=0) then
q=j
exit
end if
end if
end do
end do
只要j不满足i条件,就判断下是否ds(i)>=0,如果是的话让q=j进行下一个i循环。[em68][em68][em58][em58][em58][em45][em45][em45][em21][em21][em11][em11][em12][em12]我一直是这么想的[em8][em8][em8][em8][em8][em8][em8][em8][em8][/quote]
这么想怎么不这么做呢?啥时让你加上=0了?坚决不能等于0哦![em1]
程序1
q=1
do i=1,450000-1
do j=q,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
else
if(ds(i)>0) then
q=j
exit
end if
end if
end do
end do
程序2
q=1
do i=1,450000-1
do j=q,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
q=j+1
else
if(ds(i)>0) exit
end if
end do
end do
比较一下两者的结果?想想为什么?[em18]
56 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 21:41:00
[em22][em22][em22][em9][em9][em10][em10][em10][em10][em10][em10][em10][em10][em75][em75][em75][em75][em75]
看上去结果一样啊!!
程序1。先判断j是否满足i条件,满足了,ds+1,j自动加1再判断,直到出现不满足i条件的j,让p=j然后退出,进行下一个i的循环。
如果刚上来j就不满足i的条件,那就直接进行下一个i的循环。
变化的是j,不是q。
程序2。先判断j是否满足i条件,满足了,ds+1,q=j+1,改变q的值再判断是否满足i条件,直到出现不满足i条件的q,然后退出,进行下一个i的循环。
如果刚上来j就不满足i的条件,q值不变,就直接进行下一个i的循环。
变化的是q。
你给我当老师好样的!
你是不是大学教授?水平太高了!!
57 楼
jstzhurj [专家分:4680] 发布于 2010-09-01 10:10:00
[em1]哎,一知半解!有这么难理解么?
程序1
对于特定的i,逐一判断j是否满足,满足ds+1;当满足过,又突然不满足了ds>0(不能=0!不知道你怎么擅自加了=0,等于0还是没有满足过啊),q=j退出:对这个i,q不满足,不一定下一个i,这个q也不满足,所以下次循环q开始!
程序2
对于特定的i,逐一判断j是否满足,满足ds+1,满足一次就q=j+1赋值一次:q满足了这次的i,就必然不满足下次的i,所以j+1;当满足过ds>0,又突然不满足了,退出!
注意!两个程序一直不满足就没有机会给q赋值!一直不满足就让j一直从1到4*m*n循环!
当然,这种考虑效率算法的前提条件单调函数!没有这个前提,就老老实实不要加exit!j每次都从1开始!
58 楼
tianhy2010 [专家分:60] 发布于 2010-09-01 12:26:00
[em7][em7][em7][em7][em7][em2][em2][em2][em2][em2]
我来回复