回 帖 发 新 帖 刷新版面

主题:jstzhurj老师,我又将程序简化了,能否看下?

还是上次那代码。我想了下,由于相邻的两个特征值之间可能有好几个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

回复列表 (共58个回复)

41 楼

[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 楼

[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 楼

[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 楼

经典!!你太牛啦!!

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 楼


[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 楼

[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 楼


程序修改说明:
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 楼


想了好久啊,想去吃饭的,下雨啦!!![em67][em67][em67][em67][em67]没带[em77][em77][em77][em77][em77][em77][em52][em52][em52][em52][em52][em21][em21][em21][em21][em21][em21]你水平太高了。

49 楼

[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 楼


姐姐,刚我这里下雨了,没能出去吃饭,我先去吃饭了。[em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em21][em40][em40][em40][em40]

我来回复

您尚未登录,请登录后再回复。点此登录或注册