我有3个矩阵,分别是gXgYgNorm,一个这样的for循环:

for(y=1; y<n-1; y++){
      int base = y*this->_nxsIn;
      for(x=1; x<n-1; x++){
          i1 = base + x;
          i2 = i1 + 1;
          i3 = i1 + n;
          den = ( (gX[i1]+gY[i1])*gNorm[i1] - gX[i2]*gNorm[i2] - gY[i3]*gNorm[i3];
}


如果我以这种方式提取产品gX * gNormgY * gNorm

for(y=0; y<n; y++){
      int base = y*n;
      for(x=0; x<n; x++){
           i = base + x;
          GxGnorm[i] = gX[i]*gNorm[i];
       }
   }

//Gy * GNorm

for(y=0; y<n; y++){
     int base = y*n;
     for(x=0; x<n; x++){
          i = base + x;
         GyGnorm[i] = gY[i]*gNorm[i];
      }
}


for(y=1; y<this->_nysIn-1; y++){
      int base = y*this->_nxsIn;
      for(x=1; x<this->_nxsIn-1; x++){
      i1 = base + x;
      i2 = i1 + 1;
      i3 = i1 + n;

      i1Sum = GxGnorm[i1] + GyGnorm[i1];         //(gX[i1]+gY[i1])*gNorm[i1];
      float sum1 = GxGnorm[i2] + GyGnorm[i3];    //gX[i2]*gNorm[i2];

     }
}


我可以改善计算时间吗?

如果没有,为什么?

最佳答案

好吧,这两个脚本具有相同的渐近时间O(n ^ 2),如果您有大量数据集,则这是很糟糕的。

当您在第二个脚本中重复嵌套循环时,实际上是在增加常量因子。再加上创建额外阵列的成本。

除了这两个脚本,其他脚本都非常相似。因此,第二个脚本实际上可能会更慢。

10-07 19:17
查看更多