C++代码,求大佬解答如何优化这段代码增加运行速度

for(int t=0;t<nt;t++) {

            cout<<"\n"<<t;cout.flush();

            for(int i=0;i<nx;i++) {

                    for(int j=0;j<ny;j++) {

                            if(i>0&&i<nx-1&&j>0&&j<ny-1) {

                                    vr[i][j]=(vi[i+1][j]+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.;

                            } else if(i==0&&i<nx-1&&j>0&&j<ny-1) {

                                    vr[i][j]=(vi[i+1][j]+10.+vi[i][j-1]+vi[i][j+1])/4.;

                            } else if(i>0&&i==nx-1&&j>0&&j<ny-1) {

                                    vr[i][j]=(5.+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.;

                            } else if(i>0&&i<nx-1&&j==0&&j<ny-1) {

                                    vr[i][j]=(vi[i+1][j]+vi[i-1][j]+15.45+vi[i][j+1])/4.;

                            } else if(i>0&&i<nx-1&&j>0&&j==ny-1) {

                                    vr[i][j]=(vi[i+1][j]+vi[i-1][j]+vi[i][j-1]-6.7)/4.;

                            }
                    }
            }

            for(int i=0;i<nx;i++) {

                    for(int j=0;j<ny;j++) {

                            if(fabs(fabs(vr[i][j])-fabs(vi[i][j]))<1e-2) fout<<"\n"<<t<<" "<<i<<" "<<j<<" "<<fabs(vi[i][j])<<" "<<fabs(vr[i][j]);

                    }
            }

            for(int i=0;i<nx;i++) {

                    for(int j=0;j<ny;j++) vi[i][j]=vi[i][j]/2.+vr[i][j]/2.;

            }
    }
qq_40946921
Italink 给出完整的代码,再说一下你想干什么,不然别人怎么给你优化
一年多之前 回复

2个回答

 if else过多。换成层级结果。
if(i>0){
  if(i<nx-1){
    //...
  }
  else if(i==nx-1){
    //...
  }
}
else if(i==0){
  //...
}

以此类推。

你的代码逻辑很有规律,可以优化:

/* i=[0,nx-1], j=[0,ny-1] */
for(int i=0;i<nx;i++) {
    for(int j=0;j<ny;j++) {

        /* i=(0,nx-1), j=(0,ny-1) */
        if(i>0&&i<nx-1&&j>0&&j<ny-1) {
            vr[i][j]=(vi[i+1][j]+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.;

        } else {
            /* i=0 or i=nx-1, j=0 or j=ny-1 */
            if ((i==0 || i==nx-1) && (j==0 || i==ny-1))
                continue;

            /* i=0, j=(0,ny-1)      delta_vr[i][j]=10.  */
            /* j=0, i=(0,nx-1)      delta_vr[i][j]=15.45  */
            /* i=nx-1, j=(0,ny-1)   delta_vr[i][j]=5.  */
            /* j=ny-1, i=(0,nx-1)   delta_vr[i][j]=-6.7  */
            else
                vr[i][j]=(vi[i+1][j]+vi[i][j-1]+vi[i][j+1]+(!i?10.:(!j?15.45:(i?5.:-6.7))))/4.;
        }

    }
}

for(int i=0;i<nx;i++) {
    for(int j=0;j<ny;j++) {
        if(fabs(fabs(vr[i][j])-fabs(vi[i][j]))<1e-2) 
            fout<<"\n"<<t<<" "<<i<<" "<<j<<" "<<fabs(vi[i][j])<<" "<<fabs(vr[i][j]);    

        vi[i][j]=vi[i][j]/2.+vr[i][j]/2.;
    }           
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问