0

これは非常に単純な質問ですが、何がうまくいかなかったのかわかりません。このコードは、pixIDベクトルの要素数をカウントし、その合計を正方行列PtPの対角要素に返します。ただし、最初のループの「i」は次のようになりますが、要素の場合、出力は次のようになります。

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 に答える