回 帖 发 新 帖 刷新版面

主题: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个回复)

51 楼


这样不行吗?
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 楼

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


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

你水平好高啊!!高深莫测!!佩服啊

55 楼

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


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


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


[em7][em7][em7][em7][em7][em2][em2][em2][em2][em2]

我来回复

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