0

这是一个超级简单的问题,但我似乎看不出哪里出了问题。这段代码的作用是计算 pixID 向量中元素的数量,并将总和返回到方阵 PtP 中的对角线元素。然而,即使第一个循环中的 'i' 读取:0,5,10,15 的元素输出看起来像这样:

1,0,0,0,
0,0,3,0,
0,0,0,0,
0,3,0,0,

而不是想要的:

1,0,0,0,
0,3,0,0,
0,0,2,0,
0,0,0,2,

知道这里发生了什么吗?

  double where(std::vector<double> &vec,unsigned int &v){

     double count = 0;
     int val;
     for(std::vector<double>::iterator it = vec.begin();
         it != vec.end();
         ++it){
       if(*it == val){
         count++;
       }
     }

  return count;
  }


  int main(){

  unsigned int pixSide = 2;
  int id;
  std::vector<double> pixID {1,1,2,3,0,2,1,3};
  std::vector<double> PtP (pixSide*pixSide);

  for(unsigned int i=0;i<pixSide*pixSide;i++){
    id = i*pixSide*pixSide + i;
    std::cout << id << std::endl;
    PtP[id] = where(pixID,i);
  }

  for(int i=0;i<pixSide*pixSide;i++){
    for(int j=0;j<pixSide*pixSide;j++){
      std::cout << int(PtP[i*pixSide + j]) << ',';
      if(j==pixSide*pixSide-1){
    std::cout << std::endl;
      }
    }
  }
}
4

1 回答 1

1

首先,您没有在 where() 中使用参数“v”。相反,您使用的是未初始化的局部变量“val”。

其次,我认为您可能在某些方面混淆了对象的尺寸。我认为您对是否只保留对角线或整个矩阵感到困惑。

这样,您将始终保持整个矩阵:

std::vector<double> PtP (pixSide*pixSide);

应该

std::vector<double> PtP (pixSide*pixSide*pixSide*pixSide);

std::cout << int(PtP[i*pixSide + j]) << ',';

应该

std::cout << int(PtP[i*pixSide*pixSide + j]) << ',';

当然,这对于这样一个稀疏矩阵来说是一种浪费——我不知道这在您的应用程序中是否重要(您的实数是否大于 pixSide=2?)。

于 2013-03-24T22:30:29.360 回答