主题: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个回复)
41 楼
jstzhurj [专家分:4680] 发布于 2010-08-31 12:57:00
[quote]当avereig(j)不在Ef(i)和Ef(i+1)之间的时候就退出。
比如Ef(12)=0.01,Ef(13)=0.21,
avereig(1)=0.05,avereig(2)=0.1,avereig(3)=0.15,avereig(4)=0.20,avereig(5)=0.25,当j=5的时候,avereig(5)就不在Ef(12)和Ef(13)之间,就退出,看下avereig(5)在不在Ef(13)和Ef(14)之间,在的话就统计ds。
q1=1
do i=q1,450000-1
do j=q2,4*m*n
if((Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))) then
ds(i)=ds(i)+1
else
q1=i+1 !不用让i从1开始循环了,从i+1开始循环,前面那些已经检查过了
exit
end if
end do
end do
[/quote]
i=1,,450000-1 每一次都会自动增1, 你每个不经过一次你怎么知道ds(i)是多少?再说了,按你的程序如果第一个j不满足,就直接退出了!后面的j再没机会比较了!!头脑不清楚,写出的程序更是稀里糊涂,不知道干个啥。
42 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 13:43:00
[em6][em6][em6][em7][em7][em7][em9][em9][em9][em32][em32][em32][em56][em56][em56]
谢谢大姐指导。
我不知道是否这样修改下就可以了:
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
exit
end if
end do
end do
我觉得这样修改之后:
1)i=1,,450000-1 每一次都会自动增1, 每经过一次知道ds(i)是多少了。
2)再说了,按你的程序如果第一个j不满足,就直接退出了!后面的j再没机会比较了。
是这样的:如果到某个avereig(j)的时候突然不满足条件
(Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))
但是avereig(j)前面的特征值avereig(j-1)满足这个条件,avereig(j)后面的数一定不再满足这个条件,因为它后面的数肯定比avereig(j)大,avereig(j)都不在这个区间了,avereig(j+1)自然不会在这个区间,后面的j也就不用再比较了。
我不清楚地是:exit的作用是打断整个循环,还是结束j的循环,继续i的下个循环?
43 楼
jstzhurj [专家分:4680] 发布于 2010-08-31 14:14:00
[quote][em6][em6][em6][em7][em7][em7][em9][em9][em9][em32][em32][em32][em56][em56][em56]
谢谢大姐指导。
我不知道是否这样修改下就可以了:
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
exit
end if
end do
end do
我觉得这样修改之后:
1)i=1,,450000-1 每一次都会自动增1, 每经过一次知道ds(i)是多少了。
2)再说了,按你的程序如果第一个j不满足,就直接退出了!后面的j再没机会比较了。
是这样的:如果到某个avereig(j)的时候突然不满足条件
(Ef(i)<=avereig(j)) .and. (avereig(j)<Ef(i+1))
但是avereig(j)前面的特征值avereig(j-1)满足这个条件,avereig(j)后面的数一定不再满足这个条件,因为它后面的数肯定比avereig(j)大,avereig(j)都不在这个区间了,avereig(j+1)自然不会在这个区间,后面的j也就不用再比较了。
我不清楚地是:exit的作用是打断整个循环,还是结束j的循环,继续i的下个循环?[/quote]
稍微进步了些^_^,对于2,比如i=1,j=1就不满足,就直接退出j循环了!j=2,3,...4*m*n 就再没机会比较了!
提醒一下:必须找到过,然后突然不满足才退出(退出是有条件的,不是你那样一开始找不到就退出);如果一直找不到满足的j就一直找到4*m*n为止。
exit是退出j的循环,继续i的下个循环。
44 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 16:00: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
[em44][em44][em71][em71][em72][em72][em72][em72][em72][em35][em35][em2][em2][em2][em1][em1][em1][em62][em62][em62]
45 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 16:20:00
[em35][em35][em35][em35][em35][em36][em36][em36][em36][em36][em36][em37][em37][em37][em37][em37][em38][em38][em38][em38][em38][em40][em40][em40][em40][em40][em40][em43][em43][em43][em43][em43][em44][em44][em44][em44][em44][em45][em45][em45][em45][em45][em46][em46][em46][em46][em46][em48][em48][em48][em48][em48]
46 楼
jstzhurj [专家分:4680] 发布于 2010-08-31 16:33: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
[em44][em44][em71][em71][em72][em72][em72][em72][em72][em35][em35][em2][em2][em2][em1][em1][em1][em62][em62][em62][/quote]
不要高兴太早哦,还有点小问题,如果i=1时,j=1,2...4*m*n都没有满足,q=?下一次i循环的时候,j怎么循环?[em20][em20][em18][em18]
47 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 18:31: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...4*m*n都没有满足,q=?下一次i循环的时候,j怎么循环?
到底怎么循环呢?
一直在j=1上无限循环下去,因为ds=0,每次循环结束都让q=1,j=1又不满足循环退出的条件,所以会一直循环下去。
我把退出条件成:
if(ds(i>=0)) then
exit
end if
或者不要if语句。
我是这么设置数据的:avereig是单调递增的,如果avereig(j)不满足i条件,那么它后面的就不用再找了,肯定不会满足i条件的,因为比它大。所以一遇到不满足条件的j,就退出循环,进行下一个i的循环。将第一个不满足条件的j传给q进行下一个i的循环。
因为我在设数据的时候一定是从j=1开始满足i条件,如果j=1不满足i=1条件,但是满足i=4条件,那么j=2、3也可能在i=4这个区间,也可能不在i=4这个区间,但是一定不会在i=1,2,3区间。如果j=3不满足i=4的条件,满足i=11的条件,那么在i=5--10之间ds(i)=0,因为j=1,2在i=4的区间了。
如果avereig(j)<Ef(i+1)),j不满足i这个区间,那么j后面的数也不在这个区间,单调递增啊,
[em35][em35][em35][em35][em35][em44][em44][em44][em44][em44][em44][em45][em45][em45][em45][em45][em74][em74][em74][em74][em74][em75][em75][em75][em75][em75][em69][em69][em69][em69][em69][em2]
48 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 18:33:00
想了好久啊,想去吃饭的,下雨啦!!![em67][em67][em67][em67][em67]没带[em77][em77][em77][em77][em77][em77][em52][em52][em52][em52][em52][em21][em21][em21][em21][em21][em21]你水平太高了。
49 楼
jstzhurj [专家分:4680] 发布于 2010-08-31 19:26: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...4*m*n都没有满足,q=?下一次i循环的时候,j怎么循环?
到底怎么循环呢?
一直在j=1上无限循环下去,因为ds=0,每次循环结束都让q=1,j=1又不满足循环退出的条件,所以会一直循环下去。
我把退出条件成:
if(ds(i>=0)) then
exit
end if
或者不要if语句。
我是这么设置数据的:avereig是单调递增的,如果avereig(j)不满足i条件,那么它后面的就不用再找了,肯定不会满足i条件的,因为比它大。所以一遇到不满足条件的j,就退出循环,进行下一个i的循环。将第一个不满足条件的j传给q进行下一个i的循环。
因为我在设数据的时候一定是从j=1开始满足i条件,如果j=1不满足i=1条件,但是满足i=4条件,那么j=2、3也可能在i=4这个区间,也可能不在i=4这个区间,但是一定不会在i=1,2,3区间。如果j=3不满足i=4的条件,满足i=11的条件,那么在i=5--10之间ds(i)=0,因为j=1,2在i=4的区间了。
如果avereig(j)<Ef(i+1)),j不满足i这个区间,那么j后面的数也不在这个区间,单调递增啊,
[em35][em35][em35][em35][em35][em44][em44][em44][em44][em44][em44][em45][em45][em45][em45][em45][em74][em74][em74][em74][em74][em75][em75][em75][em75][em75][em69][em69][em69][em69][em69][em2][/quote]
杯具啊![em1],如果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的就没机会啦!!
所以,q赋值也是有条件的!你再考虑下,改给我看看。讨论一下,进步一点就行,不要写了一段程序,自己都稀里糊涂的![em4][em16][em9][em7][em18][em19]
50 楼
tianhy2010 [专家分:60] 发布于 2010-08-31 19:40:00
姐姐,刚我这里下雨了,没能出去吃饭,我先去吃饭了。[em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em40][em40][em40][em40]
我来回复